agent_sessions 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/README.md +87 -3
  4. data/doc/Agent/Sessions/Adapters/Amp.md +91 -0
  5. data/doc/Agent/Sessions/Adapters/Base.md +198 -0
  6. data/doc/Agent/Sessions/Adapters/Claude.md +63 -0
  7. data/doc/Agent/Sessions/Adapters/Codex.md +79 -0
  8. data/doc/Agent/Sessions/Adapters/Copilot.md +38 -0
  9. data/doc/Agent/Sessions/Adapters/Cursor.md +54 -0
  10. data/doc/Agent/Sessions/Adapters/CursorIde.md +49 -0
  11. data/doc/Agent/Sessions/Adapters/Enumeration.md +135 -0
  12. data/doc/Agent/Sessions/Adapters/Gemini.md +67 -0
  13. data/doc/Agent/Sessions/Adapters/Grok.md +64 -0
  14. data/doc/Agent/Sessions/Adapters/Opencode.md +93 -0
  15. data/doc/Agent/Sessions/Adapters/Pi.md +137 -0
  16. data/doc/Agent/Sessions/Adapters/Qwen.md +32 -0
  17. data/doc/Agent/Sessions/Adapters.md +5 -0
  18. data/doc/Agent/Sessions/Audit/Finding.md +27 -0
  19. data/doc/Agent/Sessions/Audit.md +21 -0
  20. data/doc/Agent/Sessions/CLI.md +36 -0
  21. data/doc/Agent/Sessions/Check.md +27 -0
  22. data/doc/Agent/Sessions/Compaction.md +23 -0
  23. data/doc/Agent/Sessions/EnvOverride.md +19 -0
  24. data/doc/Agent/Sessions/Error.md +6 -0
  25. data/doc/Agent/Sessions/HomeExpansion.md +11 -0
  26. data/doc/Agent/Sessions/Location.md +60 -0
  27. data/doc/Agent/Sessions/Message.md +59 -0
  28. data/doc/Agent/Sessions/MissingDependency.md +6 -0
  29. data/doc/Agent/Sessions/Node.md +24 -0
  30. data/doc/Agent/Sessions/Part.md +41 -0
  31. data/doc/Agent/Sessions/Readers/Amp.md +41 -0
  32. data/doc/Agent/Sessions/Readers/Base.md +122 -0
  33. data/doc/Agent/Sessions/Readers/Claude.md +80 -0
  34. data/doc/Agent/Sessions/Readers/Codex.md +81 -0
  35. data/doc/Agent/Sessions/Readers/Copilot.md +31 -0
  36. data/doc/Agent/Sessions/Readers/Gemini.md +38 -0
  37. data/doc/Agent/Sessions/Readers/Grok.md +45 -0
  38. data/doc/Agent/Sessions/Readers/Opencode.md +37 -0
  39. data/doc/Agent/Sessions/Readers/Pi.md +38 -0
  40. data/doc/Agent/Sessions/Readers/Qwen.md +30 -0
  41. data/doc/Agent/Sessions/Readers.md +5 -0
  42. data/doc/Agent/Sessions/RoundTrip.md +57 -0
  43. data/doc/Agent/Sessions/Session.md +73 -0
  44. data/doc/Agent/Sessions/Sqlite.md +43 -0
  45. data/doc/Agent/Sessions/Store.md +57 -0
  46. data/doc/Agent/Sessions/UnknownAgent.md +6 -0
  47. data/doc/Agent/Sessions/UnreadableStore.md +6 -0
  48. data/doc/Agent/Sessions/UnsupportedFormat.md +6 -0
  49. data/doc/Agent/Sessions/Usage.md +56 -0
  50. data/doc/Agent/Sessions.md +178 -0
  51. data/doc/Agent.md +5 -0
  52. data/doc/CHANGELOG.md +77 -0
  53. data/doc/README.md +182 -0
  54. data/doc/index.csv +330 -0
  55. data/exe/agent-sessions +0 -2
  56. data/lib/agent/sessions/adapters/cursor.rb +3 -3
  57. data/lib/agent/sessions/cli.rb +2 -2
  58. data/lib/agent/sessions/message.rb +1 -2
  59. data/lib/agent/sessions/part.rb +1 -2
  60. data/lib/agent/sessions/readers/base.rb +95 -0
  61. data/lib/agent/sessions/readers/claude.rb +10 -0
  62. data/lib/agent/sessions/round_trip.rb +39 -0
  63. data/lib/agent/sessions/version.rb +1 -1
  64. data/llm.txt +178 -0
  65. metadata +56 -2
data/doc/index.csv ADDED
@@ -0,0 +1,330 @@
1
+ name,type,path
2
+ README.md,File,README.md
3
+ CHANGELOG.md,File,CHANGELOG.md
4
+ Agent,Module,Agent.md
5
+ Agent::Sessions,Module,Agent/Sessions.md
6
+ Agent::Sessions.LOADER,Constant,Agent/Sessions.md#constant-LOADER
7
+ Agent::Sessions.STALE_AFTER_DAYS,Constant,Agent/Sessions.md#constant-STALE_AFTER_DAYS
8
+ Agent::Sessions.VERIFIED_ON,Constant,Agent/Sessions.md#constant-VERIFIED_ON
9
+ Agent::Sessions.VERSION,Constant,Agent/Sessions.md#constant-VERSION
10
+ Agent::Sessions.agents,Method,Agent/Sessions.md#method-c-agents
11
+ Agent::Sessions.all,Method,Agent/Sessions.md#method-c-all
12
+ Agent::Sessions.audit,Method,Agent/Sessions.md#method-c-audit
13
+ Agent::Sessions.doctor,Method,Agent/Sessions.md#method-c-doctor
14
+ Agent::Sessions.for_project,Method,Agent/Sessions.md#method-c-for_project
15
+ Agent::Sessions.installed,Method,Agent/Sessions.md#method-c-installed
16
+ Agent::Sessions.locate,Method,Agent/Sessions.md#method-c-locate
17
+ Agent::Sessions.projects,Method,Agent/Sessions.md#method-c-projects
18
+ Agent::Sessions.read,Method,Agent/Sessions.md#method-c-read
19
+ Agent::Sessions.register,Method,Agent/Sessions.md#method-c-register
20
+ Agent::Sessions.registry,Method,Agent/Sessions.md#method-c-registry
21
+ Agent::Sessions.sessions,Method,Agent/Sessions.md#method-c-sessions
22
+ Agent::Sessions.unresolved_project_count,Method,Agent/Sessions.md#method-c-unresolved_project_count
23
+ Agent::Sessions.verify,Method,Agent/Sessions.md#method-c-verify
24
+ Agent::Sessions::Sqlite,Module,Agent/Sessions/Sqlite.md
25
+ Agent::Sessions::Sqlite.escape_uri_path,Method,Agent/Sessions/Sqlite.md#method-c-escape_uri_path
26
+ Agent::Sessions::Sqlite.open_readonly,Method,Agent/Sessions/Sqlite.md#method-c-open_readonly
27
+ Agent::Sessions::Readers,Module,Agent/Sessions/Readers.md
28
+ Agent::Sessions::Adapters,Module,Agent/Sessions/Adapters.md
29
+ Agent::Sessions::HomeExpansion,Module,Agent/Sessions/HomeExpansion.md
30
+ Agent::Sessions::Adapters::Enumeration,Module,Agent/Sessions/Adapters/Enumeration.md
31
+ Agent::Sessions::Adapters::Enumeration.MAX_LINE_BYTES,Constant,Agent/Sessions/Adapters/Enumeration.md#constant-MAX_LINE_BYTES
32
+ Agent::Sessions::Adapters::Enumeration.bytes_for,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-bytes_for
33
+ Agent::Sessions::Adapters::Enumeration.encode_project,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-encode_project
34
+ Agent::Sessions::Adapters::Enumeration.project_dir_name,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-project_dir_name
35
+ Agent::Sessions::Adapters::Enumeration.project_path_for,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-project_path_for
36
+ Agent::Sessions::Adapters::Enumeration.project_paths,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-project_paths
37
+ Agent::Sessions::Adapters::Enumeration.session_id_from,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-session_id_from
38
+ Agent::Sessions::Adapters::Enumeration.sessions,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-sessions
39
+ Agent::Sessions::Adapters::Enumeration.sessions_for_project,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-sessions_for_project
40
+ Agent::Sessions::Adapters::Enumeration.started_at_for,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-started_at_for
41
+ Agent::Sessions::Adapters::Enumeration.updated_at_for,Method,Agent/Sessions/Adapters/Enumeration.md#method-i-updated_at_for
42
+ Agent::Sessions::CLI,Class,Agent/Sessions/CLI.md
43
+ Agent::Sessions::CLI.STATUS_MARKS,Constant,Agent/Sessions/CLI.md#constant-STATUS_MARKS
44
+ Agent::Sessions::CLI.SINCE_UNITS,Constant,Agent/Sessions/CLI.md#constant-SINCE_UNITS
45
+ Agent::Sessions::CLI.ID_COLUMN_MAX,Constant,Agent/Sessions/CLI.md#constant-ID_COLUMN_MAX
46
+ Agent::Sessions::CLI.GROUP_COLUMN_MAX,Constant,Agent/Sessions/CLI.md#constant-GROUP_COLUMN_MAX
47
+ Agent::Sessions::CLI.initialize,Method,Agent/Sessions/CLI.md#method-i-initialize
48
+ Agent::Sessions::CLI.run,Method,Agent/Sessions/CLI.md#method-i-run
49
+ Agent::Sessions::Node,Class,Agent/Sessions/Node.md
50
+ Agent::Sessions::Node.children,Attribute,Agent/Sessions/Node.md#attribute-i-children
51
+ Agent::Sessions::Node.message,Attribute,Agent/Sessions/Node.md#attribute-i-message
52
+ Agent::Sessions::Part,Class,Agent/Sessions/Part.md
53
+ Agent::Sessions::Part.TYPES,Constant,Agent/Sessions/Part.md#constant-TYPES
54
+ Agent::Sessions::Part.initialize,Method,Agent/Sessions/Part.md#method-i-initialize
55
+ Agent::Sessions::Part.call_id,Attribute,Agent/Sessions/Part.md#attribute-i-call_id
56
+ Agent::Sessions::Part.name,Attribute,Agent/Sessions/Part.md#attribute-i-name
57
+ Agent::Sessions::Part.text,Attribute,Agent/Sessions/Part.md#attribute-i-text
58
+ Agent::Sessions::Part.type,Attribute,Agent/Sessions/Part.md#attribute-i-type
59
+ Agent::Sessions::Audit,Class,Agent/Sessions/Audit.md
60
+ Agent::Sessions::Audit.SYNC_ROOTS,Constant,Agent/Sessions/Audit.md#constant-SYNC_ROOTS
61
+ Agent::Sessions::Audit.initialize,Method,Agent/Sessions/Audit.md#method-i-initialize
62
+ Agent::Sessions::Audit.report,Method,Agent/Sessions/Audit.md#method-i-report
63
+ Agent::Sessions::Audit::Finding,Class,Agent/Sessions/Audit/Finding.md
64
+ Agent::Sessions::Audit::Finding.agent,Attribute,Agent/Sessions/Audit/Finding.md#attribute-i-agent
65
+ Agent::Sessions::Audit::Finding.bytes,Attribute,Agent/Sessions/Audit/Finding.md#attribute-i-bytes
66
+ Agent::Sessions::Audit::Finding.kind,Attribute,Agent/Sessions/Audit/Finding.md#attribute-i-kind
67
+ Agent::Sessions::Audit::Finding.path,Attribute,Agent/Sessions/Audit/Finding.md#attribute-i-path
68
+ Agent::Sessions::Audit::Finding.synced_to,Attribute,Agent/Sessions/Audit/Finding.md#attribute-i-synced_to
69
+ Agent::Sessions::Check,Class,Agent/Sessions/Check.md
70
+ Agent::Sessions::Check.pass?,Method,Agent/Sessions/Check.md#method-i-pass-3F
71
+ Agent::Sessions::Check.agent,Attribute,Agent/Sessions/Check.md#attribute-i-agent
72
+ Agent::Sessions::Check.claim,Attribute,Agent/Sessions/Check.md#attribute-i-claim
73
+ Agent::Sessions::Check.detail,Attribute,Agent/Sessions/Check.md#attribute-i-detail
74
+ Agent::Sessions::Check.status,Attribute,Agent/Sessions/Check.md#attribute-i-status
75
+ Agent::Sessions::Error,Class,Agent/Sessions/Error.md
76
+ Agent::Sessions::Store,Class,Agent/Sessions/Store.md
77
+ Agent::Sessions::Store.documented?,Method,Agent/Sessions/Store.md#method-i-documented-3F
78
+ Agent::Sessions::Store.format,Method,Agent/Sessions/Store.md#method-i-format
79
+ Agent::Sessions::Store.installed?,Method,Agent/Sessions/Store.md#method-i-installed-3F
80
+ Agent::Sessions::Store.agent,Attribute,Agent/Sessions/Store.md#attribute-i-agent
81
+ Agent::Sessions::Store.documented,Attribute,Agent/Sessions/Store.md#attribute-i-documented
82
+ Agent::Sessions::Store.effective,Attribute,Agent/Sessions/Store.md#attribute-i-effective
83
+ Agent::Sessions::Store.env_overrides,Attribute,Agent/Sessions/Store.md#attribute-i-env_overrides
84
+ Agent::Sessions::Store.label,Attribute,Agent/Sessions/Store.md#attribute-i-label
85
+ Agent::Sessions::Store.layers,Attribute,Agent/Sessions/Store.md#attribute-i-layers
86
+ Agent::Sessions::Store.retention,Attribute,Agent/Sessions/Store.md#attribute-i-retention
87
+ Agent::Sessions::Store.retention_source,Attribute,Agent/Sessions/Store.md#attribute-i-retention_source
88
+ Agent::Sessions::Store.verified_on,Attribute,Agent/Sessions/Store.md#attribute-i-verified_on
89
+ Agent::Sessions::Store.warnings,Attribute,Agent/Sessions/Store.md#attribute-i-warnings
90
+ Agent::Sessions::Usage,Class,Agent/Sessions/Usage.md
91
+ Agent::Sessions::Usage.+,Method,Agent/Sessions/Usage.md#method-i--2B
92
+ Agent::Sessions::Usage.initialize,Method,Agent/Sessions/Usage.md#method-i-initialize
93
+ Agent::Sessions::Usage.cache_creation,Attribute,Agent/Sessions/Usage.md#attribute-i-cache_creation
94
+ Agent::Sessions::Usage.cache_read,Attribute,Agent/Sessions/Usage.md#attribute-i-cache_read
95
+ Agent::Sessions::Usage.cost,Attribute,Agent/Sessions/Usage.md#attribute-i-cost
96
+ Agent::Sessions::Usage.input,Attribute,Agent/Sessions/Usage.md#attribute-i-input
97
+ Agent::Sessions::Usage.output,Attribute,Agent/Sessions/Usage.md#attribute-i-output
98
+ Agent::Sessions::Usage.reasoning,Attribute,Agent/Sessions/Usage.md#attribute-i-reasoning
99
+ Agent::Sessions::Message,Class,Agent/Sessions/Message.md
100
+ Agent::Sessions::Message.ROLES,Constant,Agent/Sessions/Message.md#constant-ROLES
101
+ Agent::Sessions::Message.initialize,Method,Agent/Sessions/Message.md#method-i-initialize
102
+ Agent::Sessions::Message.text,Method,Agent/Sessions/Message.md#method-i-text
103
+ Agent::Sessions::Message.at,Attribute,Agent/Sessions/Message.md#attribute-i-at
104
+ Agent::Sessions::Message.model,Attribute,Agent/Sessions/Message.md#attribute-i-model
105
+ Agent::Sessions::Message.parts,Attribute,Agent/Sessions/Message.md#attribute-i-parts
106
+ Agent::Sessions::Message.raw,Attribute,Agent/Sessions/Message.md#attribute-i-raw
107
+ Agent::Sessions::Message.role,Attribute,Agent/Sessions/Message.md#attribute-i-role
108
+ Agent::Sessions::Message.usage,Attribute,Agent/Sessions/Message.md#attribute-i-usage
109
+ Agent::Sessions::Session,Class,Agent/Sessions/Session.md
110
+ Agent::Sessions::Session.UNRESOLVED,Constant,Agent/Sessions/Session.md#constant-UNRESOLVED
111
+ Agent::Sessions::Session.initialize,Method,Agent/Sessions/Session.md#method-i-initialize
112
+ Agent::Sessions::Session.inspect,Method,Agent/Sessions/Session.md#method-i-inspect
113
+ Agent::Sessions::Session.project_path,Method,Agent/Sessions/Session.md#method-i-project_path
114
+ Agent::Sessions::Session.to_h,Method,Agent/Sessions/Session.md#method-i-to_h
115
+ Agent::Sessions::Session.uid,Method,Agent/Sessions/Session.md#method-i-uid
116
+ Agent::Sessions::Session.agent,Attribute,Agent/Sessions/Session.md#attribute-i-agent
117
+ Agent::Sessions::Session.bytes,Attribute,Agent/Sessions/Session.md#attribute-i-bytes
118
+ Agent::Sessions::Session.fidelity,Attribute,Agent/Sessions/Session.md#attribute-i-fidelity
119
+ Agent::Sessions::Session.format,Attribute,Agent/Sessions/Session.md#attribute-i-format
120
+ Agent::Sessions::Session.id,Attribute,Agent/Sessions/Session.md#attribute-i-id
121
+ Agent::Sessions::Session.path,Attribute,Agent/Sessions/Session.md#attribute-i-path
122
+ Agent::Sessions::Session.started_at,Attribute,Agent/Sessions/Session.md#attribute-i-started_at
123
+ Agent::Sessions::Session.updated_at,Attribute,Agent/Sessions/Session.md#attribute-i-updated_at
124
+ Agent::Sessions::Location,Class,Agent/Sessions/Location.md
125
+ Agent::Sessions::Location.enumerable?,Method,Agent/Sessions/Location.md#method-i-enumerable-3F
126
+ Agent::Sessions::Location.exists?,Method,Agent/Sessions/Location.md#method-i-exists-3F
127
+ Agent::Sessions::Location.files,Method,Agent/Sessions/Location.md#method-i-files
128
+ Agent::Sessions::Location.initialize,Method,Agent/Sessions/Location.md#method-i-initialize
129
+ Agent::Sessions::Location.format,Attribute,Agent/Sessions/Location.md#attribute-i-format
130
+ Agent::Sessions::Location.glob,Attribute,Agent/Sessions/Location.md#attribute-i-glob
131
+ Agent::Sessions::Location.kind,Attribute,Agent/Sessions/Location.md#attribute-i-kind
132
+ Agent::Sessions::Location.path,Attribute,Agent/Sessions/Location.md#attribute-i-path
133
+ Agent::Sessions::Location.single_file,Attribute,Agent/Sessions/Location.md#attribute-i-single_file
134
+ Agent::Sessions::Compaction,Class,Agent/Sessions/Compaction.md
135
+ Agent::Sessions::Compaction.at,Attribute,Agent/Sessions/Compaction.md#attribute-i-at
136
+ Agent::Sessions::Compaction.raw,Attribute,Agent/Sessions/Compaction.md#attribute-i-raw
137
+ Agent::Sessions::Compaction.replaced_count,Attribute,Agent/Sessions/Compaction.md#attribute-i-replaced_count
138
+ Agent::Sessions::Readers::Pi,Class,Agent/Sessions/Readers/Pi.md
139
+ Agent::Sessions::Readers::Pi.NON_MESSAGE_TYPES,Constant,Agent/Sessions/Readers/Pi.md#constant-NON_MESSAGE_TYPES
140
+ Agent::Sessions::Readers::Pi.ROLES,Constant,Agent/Sessions/Readers/Pi.md#constant-ROLES
141
+ Agent::Sessions::Readers::Pi.usage,Method,Agent/Sessions/Readers/Pi.md#method-i-usage
142
+ Agent::Sessions::RoundTrip,Class,Agent/Sessions/RoundTrip.md
143
+ Agent::Sessions::RoundTrip.at,Method,Agent/Sessions/RoundTrip.md#method-i-at
144
+ Agent::Sessions::RoundTrip.calls,Method,Agent/Sessions/RoundTrip.md#method-i-calls
145
+ Agent::Sessions::RoundTrip.model,Method,Agent/Sessions/RoundTrip.md#method-i-model
146
+ Agent::Sessions::RoundTrip.parts,Method,Agent/Sessions/RoundTrip.md#method-i-parts
147
+ Agent::Sessions::RoundTrip.roles,Method,Agent/Sessions/RoundTrip.md#method-i-roles
148
+ Agent::Sessions::RoundTrip.index,Attribute,Agent/Sessions/RoundTrip.md#attribute-i-index
149
+ Agent::Sessions::RoundTrip.messages,Attribute,Agent/Sessions/RoundTrip.md#attribute-i-messages
150
+ Agent::Sessions::RoundTrip.recorded,Attribute,Agent/Sessions/RoundTrip.md#attribute-i-recorded
151
+ Agent::Sessions::RoundTrip.usage,Attribute,Agent/Sessions/RoundTrip.md#attribute-i-usage
152
+ Agent::Sessions::Adapters::Pi,Class,Agent/Sessions/Adapters/Pi.md
153
+ Agent::Sessions::Adapters::Pi.FILENAME,Constant,Agent/Sessions/Adapters/Pi.md#constant-FILENAME
154
+ Agent::Sessions::Adapters::Pi.encode_project,Method,Agent/Sessions/Adapters/Pi.md#method-i-encode_project
155
+ Agent::Sessions::Adapters::Pi.project_path_for,Method,Agent/Sessions/Adapters/Pi.md#method-i-project_path_for
156
+ Agent::Sessions::Adapters::Pi.session_id_from,Method,Agent/Sessions/Adapters/Pi.md#method-i-session_id_from
157
+ Agent::Sessions::Adapters::Pi.started_at_for,Method,Agent/Sessions/Adapters/Pi.md#method-i-started_at_for
158
+ Agent::Sessions::Adapters::Pi.warnings,Method,Agent/Sessions/Adapters/Pi.md#method-i-warnings
159
+ Agent::Sessions::Adapters::Pi.reader_class,Method,Agent/Sessions/Adapters/Pi.md#method-c-reader_class
160
+ Agent::Sessions::Readers::Amp,Class,Agent/Sessions/Readers/Amp.md
161
+ Agent::Sessions::Readers::Amp.MAX_DOCUMENT_BYTES,Constant,Agent/Sessions/Readers/Amp.md#constant-MAX_DOCUMENT_BYTES
162
+ Agent::Sessions::Readers::Amp.CONTENT_PARTS,Constant,Agent/Sessions/Readers/Amp.md#constant-CONTENT_PARTS
163
+ Agent::Sessions::Readers::Amp.ROLES,Constant,Agent/Sessions/Readers/Amp.md#constant-ROLES
164
+ Agent::Sessions::Readers::Amp.partial?,Method,Agent/Sessions/Readers/Amp.md#method-i-partial-3F
165
+ Agent::Sessions::Adapters::Amp,Class,Agent/Sessions/Adapters/Amp.md
166
+ Agent::Sessions::Adapters::Amp.project_path_for,Method,Agent/Sessions/Adapters/Amp.md#method-i-project_path_for
167
+ Agent::Sessions::Adapters::Amp.warnings,Method,Agent/Sessions/Adapters/Amp.md#method-i-warnings
168
+ Agent::Sessions::Adapters::Amp.reader_class,Method,Agent/Sessions/Adapters/Amp.md#method-c-reader_class
169
+ Agent::Sessions::EnvOverride,Class,Agent/Sessions/EnvOverride.md
170
+ Agent::Sessions::EnvOverride.active?,Method,Agent/Sessions/EnvOverride.md#method-i-active-3F
171
+ Agent::Sessions::EnvOverride.name,Attribute,Agent/Sessions/EnvOverride.md#attribute-i-name
172
+ Agent::Sessions::EnvOverride.value,Attribute,Agent/Sessions/EnvOverride.md#attribute-i-value
173
+ Agent::Sessions::Readers::Base,Class,Agent/Sessions/Readers/Base.md
174
+ Agent::Sessions::Readers::Base.MAX_RECORD_BYTES,Constant,Agent/Sessions/Readers/Base.md#constant-MAX_RECORD_BYTES
175
+ Agent::Sessions::Readers::Base.branching?,Method,Agent/Sessions/Readers/Base.md#method-i-branching-3F
176
+ Agent::Sessions::Readers::Base.compactions,Method,Agent/Sessions/Readers/Base.md#method-i-compactions
177
+ Agent::Sessions::Readers::Base.each_message,Method,Agent/Sessions/Readers/Base.md#method-i-each_message
178
+ Agent::Sessions::Readers::Base.each_round_trip,Method,Agent/Sessions/Readers/Base.md#method-i-each_round_trip
179
+ Agent::Sessions::Readers::Base.fidelity,Method,Agent/Sessions/Readers/Base.md#method-i-fidelity
180
+ Agent::Sessions::Readers::Base.initialize,Method,Agent/Sessions/Readers/Base.md#method-i-initialize
181
+ Agent::Sessions::Readers::Base.messages,Method,Agent/Sessions/Readers/Base.md#method-i-messages
182
+ Agent::Sessions::Readers::Base.partial?,Method,Agent/Sessions/Readers/Base.md#method-i-partial-3F
183
+ Agent::Sessions::Readers::Base.round_trips,Method,Agent/Sessions/Readers/Base.md#method-i-round_trips
184
+ Agent::Sessions::Readers::Base.round_trips_recorded?,Method,Agent/Sessions/Readers/Base.md#method-i-round_trips_recorded-3F
185
+ Agent::Sessions::Readers::Base.tree,Method,Agent/Sessions/Readers/Base.md#method-i-tree
186
+ Agent::Sessions::Readers::Base.usage,Method,Agent/Sessions/Readers/Base.md#method-i-usage
187
+ Agent::Sessions::Readers::Base.warnings,Method,Agent/Sessions/Readers/Base.md#method-i-warnings
188
+ Agent::Sessions::Readers::Base.session,Attribute,Agent/Sessions/Readers/Base.md#attribute-i-session
189
+ Agent::Sessions::Readers::Grok,Class,Agent/Sessions/Readers/Grok.md
190
+ Agent::Sessions::Readers::Grok.TRANSCRIPT,Constant,Agent/Sessions/Readers/Grok.md#constant-TRANSCRIPT
191
+ Agent::Sessions::Readers::Grok.UNIFIED_LOG,Constant,Agent/Sessions/Readers/Grok.md#constant-UNIFIED_LOG
192
+ Agent::Sessions::Readers::Grok.INFERENCE,Constant,Agent/Sessions/Readers/Grok.md#constant-INFERENCE
193
+ Agent::Sessions::Readers::Grok.ROLES,Constant,Agent/Sessions/Readers/Grok.md#constant-ROLES
194
+ Agent::Sessions::Readers::Grok.summary,Method,Agent/Sessions/Readers/Grok.md#method-i-summary
195
+ Agent::Sessions::Readers::Grok.usage,Method,Agent/Sessions/Readers/Grok.md#method-i-usage
196
+ Agent::Sessions::Readers::Qwen,Class,Agent/Sessions/Readers/Qwen.md
197
+ Agent::Sessions::Readers::Qwen.CONTENT_PARTS,Constant,Agent/Sessions/Readers/Qwen.md#constant-CONTENT_PARTS
198
+ Agent::Sessions::Readers::Qwen.usage,Method,Agent/Sessions/Readers/Qwen.md#method-i-usage
199
+ Agent::Sessions::Adapters::Base,Class,Agent/Sessions/Adapters/Base.md
200
+ Agent::Sessions::Adapters::Base.FIDELITIES,Constant,Agent/Sessions/Adapters/Base.md#constant-FIDELITIES
201
+ Agent::Sessions::Adapters::Base.base_dir,Method,Agent/Sessions/Adapters/Base.md#method-i-base_dir
202
+ Agent::Sessions::Adapters::Base.bytes_for,Method,Agent/Sessions/Adapters/Base.md#method-i-bytes_for
203
+ Agent::Sessions::Adapters::Base.encode_project,Method,Agent/Sessions/Adapters/Base.md#method-i-encode_project
204
+ Agent::Sessions::Adapters::Base.initialize,Method,Agent/Sessions/Adapters/Base.md#method-i-initialize
205
+ Agent::Sessions::Adapters::Base.locate,Method,Agent/Sessions/Adapters/Base.md#method-i-locate
206
+ Agent::Sessions::Adapters::Base.project_dir_name,Method,Agent/Sessions/Adapters/Base.md#method-i-project_dir_name
207
+ Agent::Sessions::Adapters::Base.project_path_for,Method,Agent/Sessions/Adapters/Base.md#method-i-project_path_for
208
+ Agent::Sessions::Adapters::Base.project_paths,Method,Agent/Sessions/Adapters/Base.md#method-i-project_paths
209
+ Agent::Sessions::Adapters::Base.retention,Method,Agent/Sessions/Adapters/Base.md#method-i-retention
210
+ Agent::Sessions::Adapters::Base.retention_source,Method,Agent/Sessions/Adapters/Base.md#method-i-retention_source
211
+ Agent::Sessions::Adapters::Base.session_id_from,Method,Agent/Sessions/Adapters/Base.md#method-i-session_id_from
212
+ Agent::Sessions::Adapters::Base.sessions,Method,Agent/Sessions/Adapters/Base.md#method-i-sessions
213
+ Agent::Sessions::Adapters::Base.sessions_for_project,Method,Agent/Sessions/Adapters/Base.md#method-i-sessions_for_project
214
+ Agent::Sessions::Adapters::Base.started_at_for,Method,Agent/Sessions/Adapters/Base.md#method-i-started_at_for
215
+ Agent::Sessions::Adapters::Base.updated_at_for,Method,Agent/Sessions/Adapters/Base.md#method-i-updated_at_for
216
+ Agent::Sessions::Adapters::Base.verify,Method,Agent/Sessions/Adapters/Base.md#method-i-verify
217
+ Agent::Sessions::Adapters::Base.warnings,Method,Agent/Sessions/Adapters/Base.md#method-i-warnings
218
+ Agent::Sessions::Adapters::Base.fidelity_value,Method,Agent/Sessions/Adapters/Base.md#method-c-fidelity_value
219
+ Agent::Sessions::Adapters::Base.homedir_config,Method,Agent/Sessions/Adapters/Base.md#method-c-homedir_config
220
+ Agent::Sessions::Adapters::Base.reader_class,Method,Agent/Sessions/Adapters/Base.md#method-c-reader_class
221
+ Agent::Sessions::Adapters::Base.store_configs,Method,Agent/Sessions/Adapters/Base.md#method-c-store_configs
222
+ Agent::Sessions::Adapters::Base.agent_name,Attribute,Agent/Sessions/Adapters/Base.md#attribute-c-agent_name
223
+ Agent::Sessions::Adapters::Base.declared_warnings,Attribute,Agent/Sessions/Adapters/Base.md#attribute-c-declared_warnings
224
+ Agent::Sessions::Adapters::Base.documented_value,Attribute,Agent/Sessions/Adapters/Base.md#attribute-c-documented_value
225
+ Agent::Sessions::Adapters::Base.label_text,Attribute,Agent/Sessions/Adapters/Base.md#attribute-c-label_text
226
+ Agent::Sessions::Adapters::Base.verified_on_date,Attribute,Agent/Sessions/Adapters/Base.md#attribute-c-verified_on_date
227
+ Agent::Sessions::Adapters::Grok,Class,Agent/Sessions/Adapters/Grok.md
228
+ Agent::Sessions::Adapters::Grok.bytes_for,Method,Agent/Sessions/Adapters/Grok.md#method-i-bytes_for
229
+ Agent::Sessions::Adapters::Grok.decode_project,Method,Agent/Sessions/Adapters/Grok.md#method-i-decode_project
230
+ Agent::Sessions::Adapters::Grok.encode_project,Method,Agent/Sessions/Adapters/Grok.md#method-i-encode_project
231
+ Agent::Sessions::Adapters::Grok.project_dir_name,Method,Agent/Sessions/Adapters/Grok.md#method-i-project_dir_name
232
+ Agent::Sessions::Adapters::Grok.project_path_for,Method,Agent/Sessions/Adapters/Grok.md#method-i-project_path_for
233
+ Agent::Sessions::Adapters::Grok.session_id_from,Method,Agent/Sessions/Adapters/Grok.md#method-i-session_id_from
234
+ Agent::Sessions::Adapters::Grok.started_at_for,Method,Agent/Sessions/Adapters/Grok.md#method-i-started_at_for
235
+ Agent::Sessions::Adapters::Grok.updated_at_for,Method,Agent/Sessions/Adapters/Grok.md#method-i-updated_at_for
236
+ Agent::Sessions::Adapters::Grok.warnings,Method,Agent/Sessions/Adapters/Grok.md#method-i-warnings
237
+ Agent::Sessions::Adapters::Grok.reader_class,Method,Agent/Sessions/Adapters/Grok.md#method-c-reader_class
238
+ Agent::Sessions::Adapters::Qwen,Class,Agent/Sessions/Adapters/Qwen.md
239
+ Agent::Sessions::Adapters::Qwen.project_path_for,Method,Agent/Sessions/Adapters/Qwen.md#method-i-project_path_for
240
+ Agent::Sessions::Adapters::Qwen.warnings,Method,Agent/Sessions/Adapters/Qwen.md#method-i-warnings
241
+ Agent::Sessions::Adapters::Qwen.reader_class,Method,Agent/Sessions/Adapters/Qwen.md#method-c-reader_class
242
+ Agent::Sessions::Readers::Codex,Class,Agent/Sessions/Readers/Codex.md
243
+ Agent::Sessions::Readers::Codex.NON_MESSAGE_TYPES,Constant,Agent/Sessions/Readers/Codex.md#constant-NON_MESSAGE_TYPES
244
+ Agent::Sessions::Readers::Codex.ROLES,Constant,Agent/Sessions/Readers/Codex.md#constant-ROLES
245
+ Agent::Sessions::Readers::Codex.CONTENT_PARTS,Constant,Agent/Sessions/Readers/Codex.md#constant-CONTENT_PARTS
246
+ Agent::Sessions::Readers::Codex.TOOL_CALLS,Constant,Agent/Sessions/Readers/Codex.md#constant-TOOL_CALLS
247
+ Agent::Sessions::Readers::Codex.TOOL_OUTPUTS,Constant,Agent/Sessions/Readers/Codex.md#constant-TOOL_OUTPUTS
248
+ Agent::Sessions::Readers::Codex.NON_MESSAGE_ITEMS,Constant,Agent/Sessions/Readers/Codex.md#constant-NON_MESSAGE_ITEMS
249
+ Agent::Sessions::Readers::Codex.CALL_INPUTS,Constant,Agent/Sessions/Readers/Codex.md#constant-CALL_INPUTS
250
+ Agent::Sessions::Readers::Codex.CALL_OUTPUTS,Constant,Agent/Sessions/Readers/Codex.md#constant-CALL_OUTPUTS
251
+ Agent::Sessions::Readers::Codex.usage,Method,Agent/Sessions/Readers/Codex.md#method-i-usage
252
+ Agent::Sessions::UnknownAgent,Class,Agent/Sessions/UnknownAgent.md
253
+ Agent::Sessions::Adapters::Codex,Class,Agent/Sessions/Adapters/Codex.md
254
+ Agent::Sessions::Adapters::Codex.FILENAME,Constant,Agent/Sessions/Adapters/Codex.md#constant-FILENAME
255
+ Agent::Sessions::Adapters::Codex.project_path_for,Method,Agent/Sessions/Adapters/Codex.md#method-i-project_path_for
256
+ Agent::Sessions::Adapters::Codex.session_id_from,Method,Agent/Sessions/Adapters/Codex.md#method-i-session_id_from
257
+ Agent::Sessions::Adapters::Codex.sessions,Method,Agent/Sessions/Adapters/Codex.md#method-i-sessions
258
+ Agent::Sessions::Adapters::Codex.started_at_for,Method,Agent/Sessions/Adapters/Codex.md#method-i-started_at_for
259
+ Agent::Sessions::Adapters::Codex.reader_class,Method,Agent/Sessions/Adapters/Codex.md#method-c-reader_class
260
+ Agent::Sessions::Readers::Claude,Class,Agent/Sessions/Readers/Claude.md
261
+ Agent::Sessions::Readers::Claude.NON_MESSAGE_TYPES,Constant,Agent/Sessions/Readers/Claude.md#constant-NON_MESSAGE_TYPES
262
+ Agent::Sessions::Readers::Claude.EVENT_TYPES,Constant,Agent/Sessions/Readers/Claude.md#constant-EVENT_TYPES
263
+ Agent::Sessions::Readers::Claude.CONTENT_PARTS,Constant,Agent/Sessions/Readers/Claude.md#constant-CONTENT_PARTS
264
+ Agent::Sessions::Readers::Claude.SPILL,Constant,Agent/Sessions/Readers/Claude.md#constant-SPILL
265
+ Agent::Sessions::Readers::Claude.MAX_SPILL_BYTES,Constant,Agent/Sessions/Readers/Claude.md#constant-MAX_SPILL_BYTES
266
+ Agent::Sessions::Readers::Claude.branching?,Method,Agent/Sessions/Readers/Claude.md#method-i-branching-3F
267
+ Agent::Sessions::Readers::Claude.initialize,Method,Agent/Sessions/Readers/Claude.md#method-i-initialize
268
+ Agent::Sessions::Readers::Claude.round_trips_recorded?,Method,Agent/Sessions/Readers/Claude.md#method-i-round_trips_recorded-3F
269
+ Agent::Sessions::Readers::Claude.subagents,Method,Agent/Sessions/Readers/Claude.md#method-i-subagents
270
+ Agent::Sessions::Readers::Claude.usage,Method,Agent/Sessions/Readers/Claude.md#method-i-usage
271
+ Agent::Sessions::Readers::Gemini,Class,Agent/Sessions/Readers/Gemini.md
272
+ Agent::Sessions::Readers::Gemini.MAX_DOCUMENT_BYTES,Constant,Agent/Sessions/Readers/Gemini.md#constant-MAX_DOCUMENT_BYTES
273
+ Agent::Sessions::Readers::Gemini.ROLES,Constant,Agent/Sessions/Readers/Gemini.md#constant-ROLES
274
+ Agent::Sessions::Readers::Gemini.header,Method,Agent/Sessions/Readers/Gemini.md#method-i-header
275
+ Agent::Sessions::Readers::Gemini.usage,Method,Agent/Sessions/Readers/Gemini.md#method-i-usage
276
+ Agent::Sessions::Adapters::Claude,Class,Agent/Sessions/Adapters/Claude.md
277
+ Agent::Sessions::Adapters::Claude.DEFAULT_CLEANUP_PERIOD_DAYS,Constant,Agent/Sessions/Adapters/Claude.md#constant-DEFAULT_CLEANUP_PERIOD_DAYS
278
+ Agent::Sessions::Adapters::Claude.bytes_for,Method,Agent/Sessions/Adapters/Claude.md#method-i-bytes_for
279
+ Agent::Sessions::Adapters::Claude.encode_project,Method,Agent/Sessions/Adapters/Claude.md#method-i-encode_project
280
+ Agent::Sessions::Adapters::Claude.project_path_for,Method,Agent/Sessions/Adapters/Claude.md#method-i-project_path_for
281
+ Agent::Sessions::Adapters::Claude.retention,Method,Agent/Sessions/Adapters/Claude.md#method-i-retention
282
+ Agent::Sessions::Adapters::Claude.retention_source,Method,Agent/Sessions/Adapters/Claude.md#method-i-retention_source
283
+ Agent::Sessions::Adapters::Claude.warnings,Method,Agent/Sessions/Adapters/Claude.md#method-i-warnings
284
+ Agent::Sessions::Adapters::Claude.reader_class,Method,Agent/Sessions/Adapters/Claude.md#method-c-reader_class
285
+ Agent::Sessions::Adapters::Cursor,Class,Agent/Sessions/Adapters/Cursor.md
286
+ Agent::Sessions::Adapters::Cursor.project_path_for,Method,Agent/Sessions/Adapters/Cursor.md#method-i-project_path_for
287
+ Agent::Sessions::Adapters::Cursor.session_id_from,Method,Agent/Sessions/Adapters/Cursor.md#method-i-session_id_from
288
+ Agent::Sessions::Adapters::Cursor.started_at_for,Method,Agent/Sessions/Adapters/Cursor.md#method-i-started_at_for
289
+ Agent::Sessions::Adapters::Cursor.updated_at_for,Method,Agent/Sessions/Adapters/Cursor.md#method-i-updated_at_for
290
+ Agent::Sessions::Adapters::Cursor.warnings,Method,Agent/Sessions/Adapters/Cursor.md#method-i-warnings
291
+ Agent::Sessions::Adapters::Gemini,Class,Agent/Sessions/Adapters/Gemini.md
292
+ Agent::Sessions::Adapters::Gemini.FILENAME,Constant,Agent/Sessions/Adapters/Gemini.md#constant-FILENAME
293
+ Agent::Sessions::Adapters::Gemini.encode_project,Method,Agent/Sessions/Adapters/Gemini.md#method-i-encode_project
294
+ Agent::Sessions::Adapters::Gemini.project_dir_name,Method,Agent/Sessions/Adapters/Gemini.md#method-i-project_dir_name
295
+ Agent::Sessions::Adapters::Gemini.project_path_for,Method,Agent/Sessions/Adapters/Gemini.md#method-i-project_path_for
296
+ Agent::Sessions::Adapters::Gemini.project_paths,Method,Agent/Sessions/Adapters/Gemini.md#method-i-project_paths
297
+ Agent::Sessions::Adapters::Gemini.started_at_for,Method,Agent/Sessions/Adapters/Gemini.md#method-i-started_at_for
298
+ Agent::Sessions::Adapters::Gemini.warnings,Method,Agent/Sessions/Adapters/Gemini.md#method-i-warnings
299
+ Agent::Sessions::Adapters::Gemini.reader_class,Method,Agent/Sessions/Adapters/Gemini.md#method-c-reader_class
300
+ Agent::Sessions::Readers::Copilot,Class,Agent/Sessions/Readers/Copilot.md
301
+ Agent::Sessions::Readers::Copilot.each_message,Method,Agent/Sessions/Readers/Copilot.md#method-i-each_message
302
+ Agent::Sessions::Readers::Copilot.usage,Method,Agent/Sessions/Readers/Copilot.md#method-i-usage
303
+ Agent::Sessions::Adapters::Copilot,Class,Agent/Sessions/Adapters/Copilot.md
304
+ Agent::Sessions::Adapters::Copilot.SESSION_COLUMNS,Constant,Agent/Sessions/Adapters/Copilot.md#constant-SESSION_COLUMNS
305
+ Agent::Sessions::Adapters::Copilot.project_paths,Method,Agent/Sessions/Adapters/Copilot.md#method-i-project_paths
306
+ Agent::Sessions::Adapters::Copilot.sessions,Method,Agent/Sessions/Adapters/Copilot.md#method-i-sessions
307
+ Agent::Sessions::Adapters::Copilot.sessions_for_project,Method,Agent/Sessions/Adapters/Copilot.md#method-i-sessions_for_project
308
+ Agent::Sessions::Adapters::Copilot.reader_class,Method,Agent/Sessions/Adapters/Copilot.md#method-c-reader_class
309
+ Agent::Sessions::Readers::Opencode,Class,Agent/Sessions/Readers/Opencode.md
310
+ Agent::Sessions::Readers::Opencode.CONTENT_PARTS,Constant,Agent/Sessions/Readers/Opencode.md#constant-CONTENT_PARTS
311
+ Agent::Sessions::Readers::Opencode.STATE_PARTS,Constant,Agent/Sessions/Readers/Opencode.md#constant-STATE_PARTS
312
+ Agent::Sessions::Readers::Opencode.usage,Method,Agent/Sessions/Readers/Opencode.md#method-i-usage
313
+ Agent::Sessions::UnreadableStore,Class,Agent/Sessions/UnreadableStore.md
314
+ Agent::Sessions::Adapters::Opencode,Class,Agent/Sessions/Adapters/Opencode.md
315
+ Agent::Sessions::Adapters::Opencode.DATABASE_GLOB,Constant,Agent/Sessions/Adapters/Opencode.md#constant-DATABASE_GLOB
316
+ Agent::Sessions::Adapters::Opencode.SESSION_COLUMNS,Constant,Agent/Sessions/Adapters/Opencode.md#constant-SESSION_COLUMNS
317
+ Agent::Sessions::Adapters::Opencode.base_dir,Method,Agent/Sessions/Adapters/Opencode.md#method-i-base_dir
318
+ Agent::Sessions::Adapters::Opencode.project_paths,Method,Agent/Sessions/Adapters/Opencode.md#method-i-project_paths
319
+ Agent::Sessions::Adapters::Opencode.sessions,Method,Agent/Sessions/Adapters/Opencode.md#method-i-sessions
320
+ Agent::Sessions::Adapters::Opencode.sessions_for_project,Method,Agent/Sessions/Adapters/Opencode.md#method-i-sessions_for_project
321
+ Agent::Sessions::Adapters::Opencode.verify,Method,Agent/Sessions/Adapters/Opencode.md#method-i-verify
322
+ Agent::Sessions::Adapters::Opencode.reader_class,Method,Agent/Sessions/Adapters/Opencode.md#method-c-reader_class
323
+ Agent::Sessions::MissingDependency,Class,Agent/Sessions/MissingDependency.md
324
+ Agent::Sessions::UnsupportedFormat,Class,Agent/Sessions/UnsupportedFormat.md
325
+ Agent::Sessions::Adapters::CursorIde,Class,Agent/Sessions/Adapters/CursorIde.md
326
+ Agent::Sessions::Adapters::CursorIde.KEY_PREFIX,Constant,Agent/Sessions/Adapters/CursorIde.md#constant-KEY_PREFIX
327
+ Agent::Sessions::Adapters::CursorIde.project_path_for,Method,Agent/Sessions/Adapters/CursorIde.md#method-i-project_path_for
328
+ Agent::Sessions::Adapters::CursorIde.project_paths,Method,Agent/Sessions/Adapters/CursorIde.md#method-i-project_paths
329
+ Agent::Sessions::Adapters::CursorIde.sessions,Method,Agent/Sessions/Adapters/CursorIde.md#method-i-sessions
330
+ Agent::Sessions::Adapters::CursorIde.sessions_for_project,Method,Agent/Sessions/Adapters/CursorIde.md#method-i-sessions_for_project
data/exe/agent-sessions CHANGED
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
5
-
6
4
  require "agent/sessions"
7
5
 
8
6
  exit Agent::Sessions::CLI.new(ARGV).run
@@ -115,12 +115,12 @@ module Agent
115
115
  # (`@project_path_resolver = nil`) on a Session's FIRST #project_path
116
116
  # call, not before — so any Session a caller keeps without ever reading
117
117
  # project_path stays holding a live reference to the whole adapter,
118
- # @meta included. `list` is exactly that caller: it never touches
118
+ # `@meta` included. `list` is exactly that caller: it never touches
119
119
  # project_path, so every Session it returns keeps this adapter (and
120
- # whatever of @meta got populated enumerating them) alive for as long
120
+ # whatever of `@meta` got populated enumerating them) alive for as long
121
121
  # as the caller holds that Session array — not just for one
122
122
  # enumeration pass. All N sessions from one `sessions` call share the
123
- # SAME adapter instance, so this is one retained @meta hash, not N
123
+ # SAME adapter instance, so this is one retained `@meta` hash, not N
124
124
  # copies of it.
125
125
  #
126
126
  # What actually keeps this acceptable is SIZE, not lifetime: measured
@@ -268,7 +268,7 @@ module Agent
268
268
 
269
269
  # One agent's missing dependency or unreadable store must not silently empty
270
270
  # a cross-agent listing — each skip is announced on stderr, tracked in
271
- # @skipped_agents so the command can exit non-zero, and the rest still
271
+ # `@skipped_agents` so the command can exit non-zero, and the rest still
272
272
  # print. The exit code matters as much as the stderr line: `--json` is the
273
273
  # door built for a machine consumer (design doc section 12), and a machine
274
274
  # reading `[]` next to exit 0 has no way to tell "empty store" from
@@ -335,7 +335,7 @@ module Agent
335
335
  # a skip must flip the exit code even though the rest of the output still
336
336
  # printed successfully. One list, not a list plus a boolean that mirrors
337
337
  # it: two variables recording the same fact (an earlier draft had
338
- # @agents_skipped alongside @skipped_agents) are one rename away from
338
+ # `@agents_skipped` alongside `@skipped_agents`) are one rename away from
339
339
  # silently disagreeing, which is exactly the failure mode decision 11a
340
340
  # exists to prevent.
341
341
  def exit_code_honoring_skips
@@ -16,8 +16,6 @@ module Agent
16
16
  # session-level `usage` is where those formats answer. A nil here means
17
17
  # "not recorded on this message", never "zero tokens".
18
18
  Message = Data.define(:role, :at, :parts, :raw, :usage, :model) do
19
- self::ROLES = %i[user assistant system tool unknown].freeze
20
-
21
19
  def initialize(role:, at:, parts:, raw:, usage: nil, model: nil)
22
20
  roles = self.class::ROLES
23
21
  raise ArgumentError, "role #{role.inspect} must be one of #{roles.join(", ")}" unless roles.include?(role)
@@ -32,5 +30,6 @@ module Agent
32
30
  parts.select { |part| part.type == :text }.map(&:text).join
33
31
  end
34
32
  end
33
+ Message::ROLES = %i[user assistant system tool unknown].freeze
35
34
  end
36
35
  end
@@ -11,8 +11,6 @@ module Agent
11
11
  # neither — its URL or payload stays in raw, because normalizing an image
12
12
  # would mean deciding whether to load it, and reading is stat-cheap by design.
13
13
  Part = Data.define(:type, :text, :name, :call_id) do
14
- self::TYPES = %i[text thinking tool_use tool_result image unknown].freeze
15
-
16
14
  def initialize(type:, text: nil, name: nil, call_id: nil)
17
15
  types = self.class::TYPES
18
16
  raise ArgumentError, "part type #{type.inspect} must be one of #{types.join(", ")}" unless types.include?(type)
@@ -20,5 +18,6 @@ module Agent
20
18
  super
21
19
  end
22
20
  end
21
+ Part::TYPES = %i[text thinking tool_use tool_result image unknown].freeze
23
22
  end
24
23
  end
@@ -60,6 +60,75 @@ module Agent
60
60
  # `each_message` is what a 2.6 GB file requires.
61
61
  def messages = each_message.to_a
62
62
 
63
+ # Streams, exactly as each_message does. A group is a RUN of
64
+ # neighbouring records sharing one round-trip id, not every record
65
+ # sharing that id wherever it sits in the file — collecting scattered
66
+ # records cannot stream, and rule 3 says no code path here may assume
67
+ # a file fits in memory.
68
+ #
69
+ # So an id that reappears after its run closed opens a NEW round trip
70
+ # rather than reopening the old one. That is ORDINARY for Claude, not
71
+ # an anomaly: Claude Code writes each tool_result immediately after
72
+ # the tool_use it answers, while every content block of the one API
73
+ # response keeps the same message.id, so a response making two tool
74
+ # calls has its records split by the result in between. Measured over
75
+ # the 60 most recent real Claude transcripts on this machine
76
+ # (2026-09-10): 3,315 distinct message.ids, 261 of them (7.9%) split
77
+ # across more than one run, in 33 of the 60 files; 759 of the splits
78
+ # are a tool_result record, 66 a last-prompt, 12 a file-history-delta.
79
+ #
80
+ # Hence the warning fires only where NOTHING answered a tool between
81
+ # the two runs — the case that is genuinely unexplained and would mean
82
+ # the format drifted. Warning on the benign split would put four or
83
+ # five lines under every real session's loop view, which teaches a
84
+ # caller that these warnings are noise.
85
+ def each_round_trip
86
+ return enum_for(:each_round_trip) unless block_given?
87
+
88
+ open_messages = []
89
+ open_id = nil
90
+ closed_ids = {}
91
+ answers_seen = 0
92
+ index = 0
93
+
94
+ each_message do |message|
95
+ id = round_trip_id_for(message.raw)
96
+
97
+ if id && id == open_id
98
+ open_messages << message
99
+ answers_seen += 1 if answers_a_tool?(message)
100
+ next
101
+ end
102
+
103
+ if open_messages.any?
104
+ index += 1
105
+ yield build_round_trip(index, open_messages, open_id)
106
+ end
107
+ # What this id's run closed at, counted in tool answers seen so
108
+ # far. Comparing that count against the count now is what
109
+ # separates "a tool result split one response" from "this id came
110
+ # back for a reason nothing here explains".
111
+ closed_ids[open_id] = answers_seen if open_id
112
+
113
+ if id && closed_ids[id] == answers_seen
114
+ warn_about("round-trip id #{id} reappears after its run closed with no tool answered " \
115
+ "in between; grouped as a new round trip")
116
+ end
117
+
118
+ open_messages = [message]
119
+ open_id = id
120
+ answers_seen += 1 if answers_a_tool?(message)
121
+ end
122
+
123
+ yield build_round_trip(index + 1, open_messages, open_id) if open_messages.any?
124
+ end
125
+
126
+ def round_trips = each_round_trip.to_a
127
+
128
+ # False here: most stores are an append-only list of records and no
129
+ # format names which of them belong to one model response.
130
+ def round_trips_recorded? = false
131
+
63
132
  # Whether this agent records which turn each turn followed. False here:
64
133
  # most stores are an append-only list and a tree would have to be invented.
65
134
  def branching? = false
@@ -117,6 +186,32 @@ module Agent
117
186
  def node_id_for(_record) = nil
118
187
  def parent_id_for(_record) = nil
119
188
 
189
+ # nil means "this format records no round-trip id". Same shape of
190
+ # hook as node_id_for/parent_id_for: an agent says WHERE its id
191
+ # lives, never how the grouping is assembled.
192
+ def round_trip_id_for(_record) = nil
193
+
194
+ # Whether this message is a tool answering a call. Used only to tell a
195
+ # benign split of one response's records from an unexplained one.
196
+ def answers_a_tool?(message) = message.parts.any? { |part| part.type == :tool_result }
197
+
198
+ def build_round_trip(index, messages, id)
199
+ RoundTrip.new(index: index, messages: messages, usage: usage_for(messages), recorded: !id.nil?)
200
+ end
201
+
202
+ # NEVER a sum. Claude repeats one API response's usage byte-for-byte
203
+ # on each record of that response (94 of 124 message ids in one real
204
+ # transcript), so summing the group would report roughly double what
205
+ # the vendor billed.
206
+ def usage_for(messages)
207
+ found = messages.filter_map(&:usage)
208
+ return nil if found.empty?
209
+ return found.first if found.uniq.size == 1
210
+
211
+ warn_about("round trip records disagree on usage; reporting the first")
212
+ found.first
213
+ end
214
+
120
215
  # Two passes over one session. The first records every uuid-bearing
121
216
  # record's parent and which of them became messages; the second links
122
217
  # each message to the nearest ANCESTOR that is also a message.
@@ -52,6 +52,8 @@ module Agent
52
52
  # trustworthy enough to build a tree from.
53
53
  def branching? = true
54
54
 
55
+ def round_trips_recorded? = true
56
+
55
57
  def initialize(session, resolve_spills: true, **rest)
56
58
  super(session, **rest)
57
59
  @resolve_spills = resolve_spills
@@ -112,6 +114,14 @@ module Agent
112
114
  def node_id_for(record) = record["uuid"]
113
115
  def parent_id_for(record) = record["parentUuid"]
114
116
 
117
+ # message.id is the id Anthropic's API gives one response; Claude
118
+ # Code writes one record PER CONTENT BLOCK, all repeating it. The
119
+ # reader already dedups session usage by exactly this id (usage,
120
+ # above), so the fact is known and only needs exposing. A record
121
+ # with no message.id (a user turn, an event) yields nil and becomes
122
+ # its own assumed round trip.
123
+ def round_trip_id_for(record) = record.dig("message", "id")
124
+
115
125
  def message_for(record, line_number)
116
126
  type = record["type"]
117
127
  return nil if NON_MESSAGE_TYPES.include?(type)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Agent
4
+ module Sessions
5
+ # One model response, grouped from however many records a format split it
6
+ # across. Claude Code writes one record PER CONTENT BLOCK of an API
7
+ # response: in one real transcript on this machine, 260 assistant records
8
+ # share only 124 message.id values, so a caller counting records over-
9
+ # counts what the session actually did by roughly two to one. A round
10
+ # trip is the unit that actually happened.
11
+ #
12
+ # `recorded` is the load-bearing field. False means this group was
13
+ # ASSUMED — the format names no round-trip id, so grouping fell back to
14
+ # one message per round trip — never "this session has none". Same rule
15
+ # tree()/branching? already enforce for parent links: "not recorded"
16
+ # must never read as "recorded and empty".
17
+ #
18
+ # A round trip deliberately carries NO tool results: a result can arrive
19
+ # long after its call, and grouping streams one record at a time, so
20
+ # pairing a call with its eventual result is a separate, eager layer
21
+ # (Agent::Sessions::Loop, landing next) rather than this one's job.
22
+ RoundTrip = Data.define(:index, :messages, :usage, :recorded) do
23
+ # Every part of every message, in file order.
24
+ def parts = messages.flat_map(&:parts)
25
+
26
+ # The :tool_use parts only, [] when this round trip asked for no tool.
27
+ def calls = parts.select { |part| part.type == :tool_use }
28
+
29
+ # The distinct roles in this group, in first-seen order.
30
+ def roles = messages.map(&:role).uniq
31
+
32
+ # The first recorded Time among the messages, or nil when none carried one.
33
+ def at = messages.filter_map(&:at).first
34
+
35
+ # The first recorded model String, or nil.
36
+ def model = messages.filter_map(&:model).first
37
+ end
38
+ end
39
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Agent
4
4
  module Sessions
5
- VERSION = "0.3.0"
5
+ VERSION = "0.4.0"
6
6
  end
7
7
  end