traceforge-toolkit 0.1.0__py3-none-any.whl

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 (205) hide show
  1. traceforge/__init__.py +72 -0
  2. traceforge/__main__.py +5 -0
  3. traceforge/_generated.py +254 -0
  4. traceforge/adapters/__init__.py +12 -0
  5. traceforge/adapters/base.py +82 -0
  6. traceforge/adapters/genai_otel.py +164 -0
  7. traceforge/adapters/mapped_json.py +297 -0
  8. traceforge/adapters/otel.py +220 -0
  9. traceforge/boundary/__init__.py +46 -0
  10. traceforge/boundary/data/boundary-model.joblib +0 -0
  11. traceforge/boundary/decode.py +87 -0
  12. traceforge/boundary/features.py +137 -0
  13. traceforge/boundary/inference.py +267 -0
  14. traceforge/boundary/inferencer.py +146 -0
  15. traceforge/classify/__init__.py +95 -0
  16. traceforge/classify/cmd.py +109 -0
  17. traceforge/classify/coding.py +213 -0
  18. traceforge/classify/config.py +554 -0
  19. traceforge/classify/core.py +266 -0
  20. traceforge/classify/data/binary_info.yaml +358 -0
  21. traceforge/classify/data/canonical_tools.yaml +251 -0
  22. traceforge/classify/data/effect_overrides.yaml +480 -0
  23. traceforge/classify/data/mcp_profiles.yaml +711 -0
  24. traceforge/classify/data/recommendation_rules.yaml +111 -0
  25. traceforge/classify/data/risk.yaml +534 -0
  26. traceforge/classify/data/shell_defaults.yaml +95 -0
  27. traceforge/classify/data/shell_rules.yaml +1192 -0
  28. traceforge/classify/data/tool_classifications.yaml +215 -0
  29. traceforge/classify/data/verb_inference.yaml +218 -0
  30. traceforge/classify/mcp.py +181 -0
  31. traceforge/classify/phases.py +75 -0
  32. traceforge/classify/powershell.py +93 -0
  33. traceforge/classify/registry.py +138 -0
  34. traceforge/classify/risk.py +553 -0
  35. traceforge/classify/rules.py +215 -0
  36. traceforge/classify/schema.yaml +282 -0
  37. traceforge/classify/shell.py +503 -0
  38. traceforge/classify/tools.py +91 -0
  39. traceforge/classify/workflow.py +32 -0
  40. traceforge/cli/__init__.py +42 -0
  41. traceforge/cli/config_cmd.py +130 -0
  42. traceforge/cli/detect.py +46 -0
  43. traceforge/cli/download_cmd.py +74 -0
  44. traceforge/cli/factory.py +60 -0
  45. traceforge/cli/gate_cmd.py +30 -0
  46. traceforge/cli/init_cmd.py +86 -0
  47. traceforge/cli/replay.py +130 -0
  48. traceforge/cli/runner.py +181 -0
  49. traceforge/cli/score.py +217 -0
  50. traceforge/cli/status.py +65 -0
  51. traceforge/cli/watch.py +297 -0
  52. traceforge/config/__init__.py +80 -0
  53. traceforge/config/defaults.py +149 -0
  54. traceforge/config/loader.py +239 -0
  55. traceforge/config/mappings.py +104 -0
  56. traceforge/config/models.py +579 -0
  57. traceforge/enricher.py +576 -0
  58. traceforge/formatting/__init__.py +12 -0
  59. traceforge/formatting/budget.py +92 -0
  60. traceforge/formatting/density.py +154 -0
  61. traceforge/gate/__init__.py +17 -0
  62. traceforge/gate/client.py +145 -0
  63. traceforge/gate/external.py +305 -0
  64. traceforge/gate/registry.py +108 -0
  65. traceforge/gate/server.py +174 -0
  66. traceforge/gates/__init__.py +8 -0
  67. traceforge/gates/pii.py +352 -0
  68. traceforge/gates/pii_patterns.yaml +228 -0
  69. traceforge/governance/__init__.py +121 -0
  70. traceforge/governance/assessor.py +441 -0
  71. traceforge/governance/budget.py +59 -0
  72. traceforge/governance/canonical.py +56 -0
  73. traceforge/governance/codec.py +414 -0
  74. traceforge/governance/context.py +249 -0
  75. traceforge/governance/drift.py +196 -0
  76. traceforge/governance/emitter.py +234 -0
  77. traceforge/governance/envelope.py +138 -0
  78. traceforge/governance/ifc.py +364 -0
  79. traceforge/governance/integrity.py +162 -0
  80. traceforge/governance/labeler.py +250 -0
  81. traceforge/governance/mcp_drift.py +328 -0
  82. traceforge/governance/monitor.py +539 -0
  83. traceforge/governance/observer.py +276 -0
  84. traceforge/governance/persistence.py +401 -0
  85. traceforge/governance/phase1.py +77 -0
  86. traceforge/governance/pii.py +276 -0
  87. traceforge/governance/pipeline.py +840 -0
  88. traceforge/governance/registry.py +110 -0
  89. traceforge/governance/results.py +183 -0
  90. traceforge/governance/risk_wrapper.py +113 -0
  91. traceforge/governance/rules.py +368 -0
  92. traceforge/governance/scorer.py +262 -0
  93. traceforge/governance/shield.py +318 -0
  94. traceforge/governance/state.py +466 -0
  95. traceforge/governance/types.py +176 -0
  96. traceforge/mappings/__init__.py +1 -0
  97. traceforge/mappings/aider.yaml +216 -0
  98. traceforge/mappings/aider_markdown.yaml +113 -0
  99. traceforge/mappings/amazonq.yaml +56 -0
  100. traceforge/mappings/antigravity.yaml +88 -0
  101. traceforge/mappings/claude.yaml +93 -0
  102. traceforge/mappings/cline.yaml +286 -0
  103. traceforge/mappings/codex.yaml +158 -0
  104. traceforge/mappings/continue_dev.yaml +57 -0
  105. traceforge/mappings/copilot.yaml +266 -0
  106. traceforge/mappings/copilot_markdown.yaml +72 -0
  107. traceforge/mappings/copilot_vscode.yaml +181 -0
  108. traceforge/mappings/crewai.yaml +592 -0
  109. traceforge/mappings/goose.yaml +128 -0
  110. traceforge/mappings/langgraph.yaml +165 -0
  111. traceforge/mappings/maf.yaml +90 -0
  112. traceforge/mappings/maf_transcript.yaml +99 -0
  113. traceforge/mappings/openai_agents.yaml +144 -0
  114. traceforge/mappings/opencode.yaml +473 -0
  115. traceforge/mappings/openhands.yaml +320 -0
  116. traceforge/mappings/pydantic_ai.yaml +183 -0
  117. traceforge/mappings/smolagents.yaml +89 -0
  118. traceforge/mappings/sweagent.yaml +82 -0
  119. traceforge/migrations/__init__.py +1 -0
  120. traceforge/migrations/env.py +60 -0
  121. traceforge/migrations/models.py +145 -0
  122. traceforge/migrations/runner.py +44 -0
  123. traceforge/migrations/script.py.mako +25 -0
  124. traceforge/migrations/versions/0001_initial.py +176 -0
  125. traceforge/migrations/versions/__init__.py +4 -0
  126. traceforge/models.py +29 -0
  127. traceforge/parsers/__init__.py +21 -0
  128. traceforge/parsers/aider.py +416 -0
  129. traceforge/parsers/base.py +226 -0
  130. traceforge/parsers/copilot.py +314 -0
  131. traceforge/phase/__init__.py +50 -0
  132. traceforge/phase/data/phase-model.joblib +0 -0
  133. traceforge/phase/data/potion-base-8M/README.md +99 -0
  134. traceforge/phase/data/potion-base-8M/config.json +13 -0
  135. traceforge/phase/data/potion-base-8M/model.safetensors +0 -0
  136. traceforge/phase/data/potion-base-8M/modules.json +14 -0
  137. traceforge/phase/data/potion-base-8M/tokenizer.json +1 -0
  138. traceforge/phase/event_rows.py +107 -0
  139. traceforge/phase/features.py +468 -0
  140. traceforge/phase/inference.py +279 -0
  141. traceforge/phase/inferencer.py +171 -0
  142. traceforge/phase/segmentation.py +258 -0
  143. traceforge/pipeline.py +891 -0
  144. traceforge/preprocessors/__init__.py +34 -0
  145. traceforge/preprocessors/amazonq.py +224 -0
  146. traceforge/preprocessors/antigravity.py +116 -0
  147. traceforge/preprocessors/claude.py +95 -0
  148. traceforge/preprocessors/cline.py +36 -0
  149. traceforge/preprocessors/codex.py +311 -0
  150. traceforge/preprocessors/continue_dev.py +119 -0
  151. traceforge/preprocessors/copilot_vscode.py +171 -0
  152. traceforge/preprocessors/goose.py +156 -0
  153. traceforge/preprocessors/maf_transcript.py +84 -0
  154. traceforge/preprocessors/openai_agents.py +86 -0
  155. traceforge/preprocessors/opencode.py +85 -0
  156. traceforge/preprocessors/openhands.py +36 -0
  157. traceforge/preprocessors/pydantic_ai.py +62 -0
  158. traceforge/preprocessors/registry.py +24 -0
  159. traceforge/preprocessors/smolagents.py +90 -0
  160. traceforge/py.typed +0 -0
  161. traceforge/sdk/__init__.py +59 -0
  162. traceforge/sdk/gate_policy.py +63 -0
  163. traceforge/sdk/gate_types.py +140 -0
  164. traceforge/sdk/pipeline.py +265 -0
  165. traceforge/sdk/verdict.py +81 -0
  166. traceforge/sinks/__init__.py +23 -0
  167. traceforge/sinks/base.py +95 -0
  168. traceforge/sinks/callback.py +132 -0
  169. traceforge/sinks/console.py +112 -0
  170. traceforge/sinks/factory.py +94 -0
  171. traceforge/sinks/jsonl.py +125 -0
  172. traceforge/sinks/otel_exporter.py +212 -0
  173. traceforge/sinks/parquet.py +260 -0
  174. traceforge/sinks/s3.py +206 -0
  175. traceforge/sinks/sqlite_output.py +234 -0
  176. traceforge/sinks/webhook.py +136 -0
  177. traceforge/sources/__init__.py +18 -0
  178. traceforge/sources/auto_detect.py +173 -0
  179. traceforge/sources/base.py +45 -0
  180. traceforge/sources/file_poll.py +136 -0
  181. traceforge/sources/file_watch.py +221 -0
  182. traceforge/sources/http_poll.py +141 -0
  183. traceforge/sources/replay.py +63 -0
  184. traceforge/sources/sqlite.py +187 -0
  185. traceforge/sources/sse.py +198 -0
  186. traceforge/telemetry/__init__.py +192 -0
  187. traceforge/title/__init__.py +23 -0
  188. traceforge/title/_resolve.py +79 -0
  189. traceforge/title/context.py +295 -0
  190. traceforge/title/data/boilerplate_files.json +14 -0
  191. traceforge/title/heuristics.py +429 -0
  192. traceforge/title/hygiene.py +90 -0
  193. traceforge/title/inference.py +314 -0
  194. traceforge/title/inferencer.py +477 -0
  195. traceforge/title/naming.py +398 -0
  196. traceforge/trace.py +291 -0
  197. traceforge/tracking/__init__.py +30 -0
  198. traceforge/tracking/models.py +115 -0
  199. traceforge/tracking/phase_tracker.py +288 -0
  200. traceforge/types.py +315 -0
  201. traceforge_toolkit-0.1.0.dist-info/METADATA +188 -0
  202. traceforge_toolkit-0.1.0.dist-info/RECORD +205 -0
  203. traceforge_toolkit-0.1.0.dist-info/WHEEL +4 -0
  204. traceforge_toolkit-0.1.0.dist-info/entry_points.txt +2 -0
  205. traceforge_toolkit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,473 @@
1
+ # OpenCode event mapping for MappedJsonAdapter
2
+ # Targets: opencode >= 1.2, < 2.0 (SSE stream) and opencode >= 1.17, < 2.0
3
+ # (event-sourced SQLite store).
4
+ # Source: anomalyco/opencode packages/schema/src/session-event.ts (canonical Event.define schemas)
5
+ # anomalyco/opencode packages/core/src/session/event.ts (re-export of @opencode-ai/schema/session-event)
6
+ # anomalyco/opencode packages/opencode/src/server/routes/instance/httpapi/handlers/event.ts
7
+ # anomalyco/opencode packages/opencode/src/event-v2-bridge.ts
8
+ #
9
+ # v1.17 SQLite format: ~/.local/share/opencode/opencode.db table `event`.
10
+ # Rows are {id, aggregate_id=sessionID, seq, type, data}. The type has a
11
+ # trailing version suffix (e.g. message.part.updated.1) and data is a JSON
12
+ # object/string containing session/message/part payloads. The opencode
13
+ # preprocessor strips the version suffix, routes message.updated by role, and
14
+ # routes message.part.updated by part.type (and tool state).
15
+ #
16
+ # Wire format: SSE text/event-stream, each message is event: "message", data: JSON.
17
+ # The JSON shape on the wire (Bus transport via EventV2Bridge):
18
+ # {id: string, type: string, properties: {...event data fields...}}
19
+ #
20
+ # The EventV2Bridge translates core EventV2 events to Bus events:
21
+ # EventV2.Payload {id, type, data: {...}} → Bus {id, type, properties: data}
22
+ # So all field paths are properties.* on the wire.
23
+ #
24
+ # The "type" field is the sole discriminator — dot-separated namespaced strings.
25
+ # All session.next.* events carry in properties:
26
+ # {timestamp: number (ms UTC), sessionID: string, ...event-specific fields}
27
+ #
28
+ # Base schema: {timestamp: DateTimeUtcFromMillis, sessionID: Session.ID}
29
+ # All events use aggregate: "sessionID", version: 1.
30
+ #
31
+ # Token usage: session.next.step.ended → properties.tokens =
32
+ # {input, output, reasoning, cache: {read, write}}
33
+ # Cost: session.next.step.ended → properties.cost (number, USD)
34
+ # Model: session.next.step.started → properties.model = {id, providerID, variant?}
35
+ #
36
+ # Timestamp: Despite the internal Schema name "DateTimeUtcFromMillis", the SSE
37
+ # wire format bypasses Schema.encode — JSON.stringify calls DateTime.Utc.toJSON()
38
+ # which returns an ISO 8601 UTC string (e.g. "2024-01-15T12:34:56.789Z").
39
+ #
40
+ # Prompt shape: {text: string, files?: FileAttachment[], agents?: AgentAttachment[],
41
+ # references?: ReferenceAttachment[]}
42
+ # FileAttachment: {uri, mime, name?, description?, source?}
43
+ # AgentAttachment: {name, source?}
44
+ # ReferenceAttachment: {name, kind: "local"|"git"|"invalid", uri?, repository?,
45
+ # branch?, target?, targetUri?, problem?, source?}
46
+ #
47
+ # ToolOutput.Structured: Record<string, any> (plain JSON object)
48
+ # ToolOutput.Content: tagged union on "type":
49
+ # {type: "text", text: string} | {type: "file", uri: string, mime: string, name?: string}
50
+ #
51
+ # Instance SSE also emits server.connected and server.heartbeat with empty properties.
52
+ # Global SSE (/global/event) uses a DIFFERENT wire format — not covered by this YAML.
53
+ #
54
+ # 26 total events defined in All union at v1.2.24.
55
+
56
+ framework: opencode
57
+ framework_version: ">=1.17,<2.0"
58
+ ingestion_mode: sqlite
59
+ type_field: type
60
+ timestamp_field: _timestamp
61
+ default_kind: ""
62
+ preprocessor: opencode
63
+
64
+ motivation:
65
+ sources:
66
+ - events: ["session.next.text.ended"]
67
+ field: text
68
+ role: intent
69
+ - events: ["session.next.reasoning.ended"]
70
+ field: text
71
+ role: reasoning
72
+
73
+ events:
74
+ # ── v1.17 SQLite event-sourced store ──
75
+ session.created:
76
+ kind: session.started
77
+ payload:
78
+ session_id: data.sessionID
79
+ title: data.info.title
80
+ directory: data.info.directory
81
+ version: data.info.version
82
+ cost: data.info.cost
83
+ input_tokens: data.info.tokens.input
84
+ output_tokens: data.info.tokens.output
85
+ reasoning_tokens: data.info.tokens.reasoning
86
+ cache_read_tokens: data.info.tokens.cache.read
87
+ cache_write_tokens: data.info.tokens.cache.write
88
+ permissions: data.info.permission
89
+
90
+ session.updated:
91
+ kind: session.info
92
+ payload:
93
+ session_id: data.sessionID
94
+ title: data.info.title
95
+ directory: data.info.directory
96
+ agent: data.info.agent
97
+ model_id: data.info.model.id
98
+ provider_id: data.info.model.providerID
99
+ variant: data.info.model.variant
100
+ cost: data.info.cost
101
+ input_tokens: data.info.tokens.input
102
+ output_tokens: data.info.tokens.output
103
+ reasoning_tokens: data.info.tokens.reasoning
104
+ cache_read_tokens: data.info.tokens.cache.read
105
+ cache_write_tokens: data.info.tokens.cache.write
106
+ summary: data.info.summary
107
+
108
+ message.updated.user:
109
+ kind: message.user
110
+ payload:
111
+ session_id: data.sessionID
112
+ message_id: data.info.id
113
+ role: data.info.role
114
+ agent: data.info.agent
115
+ model_id: data.info.model.modelID
116
+ provider_id: data.info.model.providerID
117
+
118
+ message.updated.assistant:
119
+ kind: message.assistant
120
+ payload:
121
+ session_id: data.sessionID
122
+ message_id: data.info.id
123
+ parent_id: data.info.parentID
124
+ role: data.info.role
125
+ agent: data.info.agent
126
+ model_id: data.info.modelID
127
+ provider_id: data.info.providerID
128
+ cost: data.info.cost
129
+ tokens: data.info.tokens
130
+
131
+ message.part.text.user:
132
+ kind: message.user
133
+ payload:
134
+ session_id: data.sessionID
135
+ message_id: data.part.messageID
136
+ part_id: data.part.id
137
+ text: data.part.text
138
+
139
+ message.part.text.assistant:
140
+ kind: message.assistant
141
+ payload:
142
+ session_id: data.sessionID
143
+ message_id: data.part.messageID
144
+ part_id: data.part.id
145
+ text: data.part.text
146
+
147
+ message.part.text.unknown:
148
+ kind: message.assistant
149
+ payload:
150
+ session_id: data.sessionID
151
+ message_id: data.part.messageID
152
+ part_id: data.part.id
153
+ text: data.part.text
154
+
155
+ message.part.reasoning:
156
+ kind: llm.reasoning.completed
157
+ payload:
158
+ session_id: data.sessionID
159
+ message_id: data.part.messageID
160
+ part_id: data.part.id
161
+ text: data.part.text
162
+ metadata: data.part.metadata
163
+ time: data.part.time
164
+
165
+ message.part.tool.running:
166
+ kind: tool.call.started
167
+ payload:
168
+ session_id: data.sessionID
169
+ message_id: data.part.messageID
170
+ part_id: data.part.id
171
+ call_id: data.part.callID
172
+ tool: data.part.tool
173
+ input: data.part.state.input
174
+ raw_input: data.part.state.raw
175
+ metadata: data.part.metadata
176
+
177
+ message.part.tool.completed:
178
+ kind: tool.call.completed
179
+ payload:
180
+ session_id: data.sessionID
181
+ message_id: data.part.messageID
182
+ part_id: data.part.id
183
+ call_id: data.part.callID
184
+ tool: data.part.tool
185
+ input: data.part.state.input
186
+ output: data.part.state.output
187
+ title: data.part.state.title
188
+ exit_code: data.part.state.metadata.exit
189
+ metadata: data.part.state.metadata
190
+ time: data.part.state.time
191
+
192
+ message.part.tool.failed:
193
+ kind: tool.call.failed
194
+ payload:
195
+ session_id: data.sessionID
196
+ message_id: data.part.messageID
197
+ part_id: data.part.id
198
+ call_id: data.part.callID
199
+ tool: data.part.tool
200
+ input: data.part.state.input
201
+ output: data.part.state.output
202
+ error: data.part.state.error
203
+ metadata: data.part.state.metadata
204
+
205
+ message.part.step-start:
206
+ kind: llm.call.started
207
+ payload:
208
+ session_id: data.sessionID
209
+ message_id: data.part.messageID
210
+ part_id: data.part.id
211
+ snapshot: data.part.snapshot
212
+
213
+ message.part.step-finish:
214
+ kind: llm.call.completed
215
+ payload:
216
+ session_id: data.sessionID
217
+ message_id: data.part.messageID
218
+ part_id: data.part.id
219
+ reason: data.part.reason
220
+ cost: data.part.cost
221
+ input_tokens: data.part.tokens.input
222
+ output_tokens: data.part.tokens.output
223
+ reasoning_tokens: data.part.tokens.reasoning
224
+ total_tokens: data.part.tokens.total
225
+ cache_read_tokens: data.part.tokens.cache.read
226
+ cache_write_tokens: data.part.tokens.cache.write
227
+ snapshot: data.part.snapshot
228
+
229
+ message.part.patch:
230
+ kind: file.edited
231
+ payload:
232
+ session_id: data.sessionID
233
+ message_id: data.part.messageID
234
+ part_id: data.part.id
235
+ files: data.part.files
236
+ hash: data.part.hash
237
+
238
+ # ── Session lifecycle ──
239
+ session.next.prompted:
240
+ kind: message.user
241
+ payload:
242
+ session_id: properties.sessionID
243
+ prompt_text: properties.prompt.text
244
+ prompt_files: properties.prompt.files
245
+ prompt_agents: properties.prompt.agents
246
+ prompt_references: properties.prompt.references
247
+
248
+ session.next.agent.switched:
249
+ kind: workflow.agent_switched
250
+ payload:
251
+ session_id: properties.sessionID
252
+ agent: properties.agent
253
+
254
+ session.next.model.switched:
255
+ kind: workflow.model_switched
256
+ payload:
257
+ session_id: properties.sessionID
258
+ model_id: properties.model.id
259
+ provider_id: properties.model.providerID
260
+ variant: properties.model.variant
261
+
262
+ session.next.synthetic:
263
+ kind: message.system
264
+ payload:
265
+ session_id: properties.sessionID
266
+ text: properties.text
267
+
268
+ session.next.retried:
269
+ kind: workflow.retried
270
+ payload:
271
+ session_id: properties.sessionID
272
+ attempt: properties.attempt
273
+ error_message: properties.error.message
274
+ status_code: properties.error.statusCode
275
+ is_retryable: properties.error.isRetryable
276
+ response_headers: properties.error.responseHeaders
277
+ response_body: properties.error.responseBody
278
+ error_metadata: properties.error.metadata
279
+
280
+ # ── Step events (LLM turn lifecycle) ──
281
+ session.next.step.started:
282
+ kind: llm.call.started
283
+ payload:
284
+ session_id: properties.sessionID
285
+ agent: properties.agent
286
+ model_id: properties.model.id
287
+ provider_id: properties.model.providerID
288
+ variant: properties.model.variant
289
+ snapshot: properties.snapshot
290
+
291
+ session.next.step.ended:
292
+ kind: llm.call.completed
293
+ payload:
294
+ session_id: properties.sessionID
295
+ finish: properties.finish
296
+ cost: properties.cost
297
+ input_tokens: properties.tokens.input
298
+ output_tokens: properties.tokens.output
299
+ reasoning_tokens: properties.tokens.reasoning
300
+ cache_read_tokens: properties.tokens.cache.read
301
+ cache_write_tokens: properties.tokens.cache.write
302
+ snapshot: properties.snapshot
303
+
304
+ session.next.step.failed:
305
+ kind: llm.call.failed
306
+ payload:
307
+ session_id: properties.sessionID
308
+ error_type: properties.error.type
309
+ error_message: properties.error.message
310
+
311
+ # ── Text streaming ──
312
+ session.next.text.started:
313
+ kind: message.assistant.started
314
+ payload:
315
+ session_id: properties.sessionID
316
+
317
+ session.next.text.delta:
318
+ kind: message.assistant.chunk
319
+ payload:
320
+ session_id: properties.sessionID
321
+ delta: properties.delta
322
+
323
+ session.next.text.ended:
324
+ kind: message.assistant
325
+ payload:
326
+ session_id: properties.sessionID
327
+ text: properties.text
328
+
329
+ # ── Reasoning streaming ──
330
+ session.next.reasoning.started:
331
+ kind: llm.reasoning.started
332
+ payload:
333
+ session_id: properties.sessionID
334
+ reasoning_id: properties.reasoningID
335
+
336
+ session.next.reasoning.delta:
337
+ kind: llm.reasoning.chunk
338
+ payload:
339
+ session_id: properties.sessionID
340
+ reasoning_id: properties.reasoningID
341
+ delta: properties.delta
342
+
343
+ session.next.reasoning.ended:
344
+ kind: llm.reasoning.completed
345
+ payload:
346
+ session_id: properties.sessionID
347
+ reasoning_id: properties.reasoningID
348
+ text: properties.text
349
+
350
+ # ── Tool input streaming ──
351
+ session.next.tool.input.started:
352
+ kind: tool.input.started
353
+ payload:
354
+ session_id: properties.sessionID
355
+ call_id: properties.callID
356
+ name: properties.name
357
+
358
+ session.next.tool.input.delta:
359
+ kind: tool.input.chunk
360
+ payload:
361
+ session_id: properties.sessionID
362
+ call_id: properties.callID
363
+ delta: properties.delta
364
+
365
+ session.next.tool.input.ended:
366
+ kind: tool.input.completed
367
+ payload:
368
+ session_id: properties.sessionID
369
+ call_id: properties.callID
370
+ text: properties.text
371
+
372
+ # ── Tool execution ──
373
+ session.next.tool.called:
374
+ kind: tool.call.started
375
+ payload:
376
+ session_id: properties.sessionID
377
+ call_id: properties.callID
378
+ tool: properties.tool
379
+ input: properties.input
380
+ provider_executed: properties.provider.executed
381
+ provider_metadata: properties.provider.metadata
382
+
383
+ session.next.tool.progress:
384
+ kind: tool.call.progress
385
+ payload:
386
+ session_id: properties.sessionID
387
+ call_id: properties.callID
388
+ structured: properties.structured
389
+ content: properties.content
390
+
391
+ session.next.tool.success:
392
+ kind: tool.call.completed
393
+ payload:
394
+ session_id: properties.sessionID
395
+ call_id: properties.callID
396
+ structured: properties.structured
397
+ content: properties.content
398
+ provider_executed: properties.provider.executed
399
+ provider_metadata: properties.provider.metadata
400
+
401
+ session.next.tool.failed:
402
+ kind: tool.call.failed
403
+ payload:
404
+ session_id: properties.sessionID
405
+ call_id: properties.callID
406
+ error_type: properties.error.type
407
+ error_message: properties.error.message
408
+ provider_executed: properties.provider.executed
409
+ provider_metadata: properties.provider.metadata
410
+
411
+ # ── Shell events ──
412
+ session.next.shell.started:
413
+ kind: tool.call.started
414
+ payload:
415
+ session_id: properties.sessionID
416
+ call_id: properties.callID
417
+ tool: "literal:shell"
418
+ input: properties.command
419
+
420
+ session.next.shell.ended:
421
+ kind: tool.call.completed
422
+ payload:
423
+ session_id: properties.sessionID
424
+ call_id: properties.callID
425
+ result: properties.output
426
+
427
+ # ── Compaction events ──
428
+ session.next.compaction.started:
429
+ kind: workflow.compaction.started
430
+ payload:
431
+ session_id: properties.sessionID
432
+ reason: properties.reason
433
+
434
+ session.next.compaction.delta:
435
+ kind: workflow.compaction.chunk
436
+ payload:
437
+ session_id: properties.sessionID
438
+ text: properties.text
439
+
440
+ session.next.compaction.ended:
441
+ kind: workflow.compaction.completed
442
+ payload:
443
+ session_id: properties.sessionID
444
+ message_id: properties.messageID
445
+ reason: properties.reason
446
+ text: properties.text
447
+ recent: properties.recent
448
+
449
+ # ── Session management (#41/#32: additive) ──
450
+ session.next.moved:
451
+ kind: session.info
452
+ payload:
453
+ session_id: properties.sessionID
454
+ directory: properties.directory
455
+ session.next.prompt.admitted:
456
+ kind: message.user
457
+ payload:
458
+ session_id: properties.sessionID
459
+ delivery: properties.delivery
460
+ text: properties.text
461
+ session.next.prompt.promoted:
462
+ kind: session.info
463
+ payload:
464
+ session_id: properties.sessionID
465
+ session.next.interrupt.requested:
466
+ kind: session.info
467
+ payload:
468
+ session_id: properties.sessionID
469
+ session.next.context.updated:
470
+ kind: session.info
471
+ payload:
472
+ session_id: properties.sessionID
473
+ message_id: properties.messageID