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,266 @@
1
+ # Copilot (GitHub Copilot CLI) — YAML mapping for traceforge
2
+ #
3
+ # Wire format: JSONL lines, each with shape:
4
+ # {type: "session.start", id: "uuid", timestamp: "ISO8601", data: {...}}
5
+ #
6
+ # The `type` field is the event discriminator.
7
+ # The `data` object contains event-specific fields in camelCase.
8
+ # Timestamps are ISO 8601 strings in the `timestamp` top-level field.
9
+ #
10
+ # Source: github-copilot-sdk session event types
11
+ # Verified against: copilot_session.jsonl fixture
12
+
13
+ framework: copilot
14
+ framework_version: "1.x"
15
+ ingestion_mode: file_watch
16
+ type_field: type
17
+ timestamp_field: timestamp
18
+ default_kind: raw
19
+
20
+ motivation:
21
+ sources:
22
+ - events: ["assistant.message", "assistant.intent"]
23
+ field: content
24
+ role: intent
25
+ - events: ["assistant.reasoning"]
26
+ field: content
27
+ role: reasoning
28
+
29
+ events:
30
+ # ── Session lifecycle ──────────────────────────────────────────────────────
31
+ session.start:
32
+ kind: session.started
33
+ payload:
34
+ model: data.selectedModel
35
+ cwd: data.context.cwd
36
+ version: data.copilotVersion
37
+
38
+ session.resume:
39
+ kind: session.resumed
40
+ payload: {}
41
+
42
+ session.shutdown:
43
+ kind: session.ended
44
+ payload:
45
+ shutdown_type: data.shutdownType
46
+ total_api_duration_ms: data.totalApiDurationMs
47
+
48
+ session.error:
49
+ kind: session.error
50
+ payload:
51
+ message: data.message
52
+
53
+ session.info:
54
+ kind: session.info
55
+ payload:
56
+ message: data.message
57
+
58
+ session.warning:
59
+ kind: session.warning
60
+ payload:
61
+ message: data.message
62
+
63
+ # data.kind.type carries the notification subtype (e.g. agent_completed);
64
+ # mapped to session.info since it is informational, not a turn message.
65
+ system.notification:
66
+ kind: session.info
67
+ payload:
68
+ message: data.content
69
+
70
+ session.plan_changed:
71
+ kind: planning.completed
72
+ payload:
73
+ operation: data.operation
74
+
75
+ session.compaction_start:
76
+ kind: session.info
77
+ payload:
78
+ system_tokens: data.systemTokens
79
+ conversation_tokens: data.conversationTokens
80
+ tool_definitions_tokens: data.toolDefinitionsTokens
81
+
82
+ session.compaction_complete:
83
+ kind: session.info
84
+ payload:
85
+ success: data.success
86
+ pre_compaction_tokens: data.preCompactionTokens
87
+ pre_compaction_messages_length: data.preCompactionMessagesLength
88
+ summary: data.summaryContent
89
+
90
+ session.permissions_changed:
91
+ kind: permission.granted
92
+ payload:
93
+ allow_all: data.allowAllPermissions
94
+ previous_allow_all: data.previousAllowAllPermissions
95
+
96
+ session.idle:
97
+ kind: session.idle
98
+ payload: {}
99
+
100
+ # ── Model selection ──────────────────────────────────────────────────────────
101
+ session.model_change:
102
+ kind: workflow.model_switched
103
+ payload:
104
+ model: data.newModel
105
+ reasoning_effort: data.reasoningEffort
106
+ context_tier: data.contextTier
107
+
108
+ # ── Workspace files ──────────────────────────────────────────────────────────
109
+ # operation ∈ {create, edit, delete}; mapped to a generic file edit, with the
110
+ # exact operation preserved in the payload.
111
+ session.workspace_file_changed:
112
+ kind: file.edited
113
+ payload:
114
+ path: data.path
115
+ operation: data.operation
116
+
117
+ # ── Messages ───────────────────────────────────────────────────────────────
118
+ user.message:
119
+ kind: message.user
120
+ payload:
121
+ content: data.content
122
+
123
+ assistant.message:
124
+ kind: message.assistant
125
+ payload:
126
+ content: data.content
127
+ reasoning: data.reasoningText
128
+ tool_requests: data.toolRequests
129
+
130
+ system.message:
131
+ kind: message.system
132
+ payload:
133
+ content: data.content
134
+
135
+ # ── Turn lifecycle ─────────────────────────────────────────────────────────
136
+ assistant.turn_start:
137
+ kind: turn.started
138
+ payload:
139
+ turn_id: data.turnId
140
+
141
+ assistant.turn_end:
142
+ kind: turn.ended
143
+ payload:
144
+ turn_id: data.turnId
145
+
146
+ # ── Reasoning ──────────────────────────────────────────────────────────────
147
+ assistant.intent:
148
+ kind: planning.started
149
+ payload:
150
+ content: data.content
151
+
152
+ assistant.reasoning:
153
+ kind: reasoning.started
154
+ payload:
155
+ content: data.content
156
+
157
+ # ── Tool lifecycle ─────────────────────────────────────────────────────────
158
+ tool.execution_start:
159
+ kind: tool.call.started
160
+ payload:
161
+ tool_call_id: data.toolCallId
162
+ tool_name: data.toolName
163
+ arguments: data.arguments
164
+
165
+ tool.execution_complete:
166
+ kind: tool.call.completed
167
+ payload:
168
+ tool_call_id: data.toolCallId
169
+ success: data.success
170
+ result: data.result.content
171
+
172
+ tool.execution_partial_result:
173
+ kind: tool.result.chunk
174
+ payload:
175
+ tool_call_id: data.toolCallId
176
+ content: data.content
177
+
178
+ tool.execution_progress:
179
+ kind: tool.progress
180
+ payload:
181
+ tool_call_id: data.toolCallId
182
+
183
+ # ── Usage ──────────────────────────────────────────────────────────────────
184
+ assistant.usage:
185
+ kind: telemetry.usage
186
+ payload:
187
+ model: data.model
188
+ input_tokens: data.inputTokens
189
+ output_tokens: data.outputTokens
190
+ cache_read_tokens: data.cacheReadTokens
191
+ cache_write_tokens: data.cacheWriteTokens
192
+ cost_usd: data.cost
193
+ duration_ms: data.duration
194
+
195
+ # ── Hooks ──────────────────────────────────────────────────────────────────
196
+ hook.start:
197
+ kind: hook.started
198
+ payload:
199
+ hook_id: data.hookInvocationId
200
+ hook_type: data.hookType
201
+
202
+ hook.end:
203
+ kind: hook.completed
204
+ payload:
205
+ hook_id: data.hookInvocationId
206
+ hook_type: data.hookType
207
+ success: data.success
208
+
209
+ # ── External tools (MCP) ───────────────────────────────────────────────────
210
+ external_tool.requested:
211
+ kind: tool.call.started
212
+ payload:
213
+ tool_name: data.toolName
214
+ arguments: data.arguments
215
+ external_tool.completed:
216
+ kind: tool.call.completed
217
+ payload:
218
+ tool_name: data.toolName
219
+ success: data.success
220
+ result: data.result.content
221
+
222
+ # ── Agent orchestration ────────────────────────────────────────────────────
223
+ subagent.started:
224
+ kind: agent.spawned
225
+ payload:
226
+ agent_id: data.agentId
227
+
228
+ subagent.completed:
229
+ kind: agent.completed
230
+ payload:
231
+ agent_id: data.agentId
232
+
233
+ subagent.failed:
234
+ kind: agent.failed
235
+ payload:
236
+ agent_id: data.agentId
237
+ message: data.message
238
+
239
+ # ── Skills ─────────────────────────────────────────────────────────────────
240
+ skill.invoked:
241
+ kind: skill.invoked
242
+ payload:
243
+ skill_name: data.skillName
244
+
245
+ # ── Permissions ────────────────────────────────────────────────────────────
246
+ permission.requested:
247
+ kind: permission.requested
248
+ payload: {}
249
+
250
+ permission.completed:
251
+ kind: permission.granted
252
+ payload: {}
253
+
254
+ # ── User input ─────────────────────────────────────────────────────────────
255
+ user_input.requested:
256
+ kind: input.requested
257
+ payload: {}
258
+
259
+ user_input.completed:
260
+ kind: input.received
261
+ payload: {}
262
+
263
+ # ── Abort ──────────────────────────────────────────────────────────────────
264
+ abort:
265
+ kind: session.abort
266
+ payload: {}
@@ -0,0 +1,72 @@
1
+ # Copilot Markdown Pre-Parser output mapping for MappedJsonAdapter
2
+ # Maps event dicts emitted by CopilotPreParser → canonical event kinds.
3
+ #
4
+ # Input: parse_turn() output — events from the SQLite turns table (rendered
5
+ # markdown). Tool calls are extracted from fenced code blocks in the assistant
6
+ # response, so fidelity is medium (heuristic, no raw tool_use/tool_result ids).
7
+ #
8
+ # NOTE: The high-fidelity Copilot capture path is copilot.yaml over
9
+ # ~/.copilot/session-state/<id>/events.jsonl. The old process-log path
10
+ # (parse_log_line, api_*/telemetry/session_event) targeted a dead Anthropic log
11
+ # format and was removed (issue #45).
12
+
13
+ framework: copilot_markdown
14
+ framework_version: ">=1.0"
15
+ ingestion_mode: sqlite
16
+ type_field: type
17
+ timestamp_field: timestamp
18
+
19
+ motivation:
20
+ targets: ["tool.call.started"]
21
+ sources:
22
+ - events: ["assistant_text"]
23
+ field: content
24
+ role: intent
25
+
26
+ events:
27
+ # ── From parse_turn(): SQLite turns table ──
28
+
29
+ user_message:
30
+ kind: message.user
31
+ payload:
32
+ content: content
33
+ turn_index: turn_index
34
+
35
+ assistant_text:
36
+ kind: message.assistant
37
+ payload:
38
+ content: content
39
+
40
+ tool_call:
41
+ kind: tool.call.started
42
+ payload:
43
+ tool_name: tool_name
44
+ input: command
45
+
46
+ code_block:
47
+ kind: tool.output
48
+ payload:
49
+ language: language
50
+ content: content
51
+
52
+ structured_output:
53
+ kind: tool.output
54
+ payload:
55
+ format: format
56
+ data: data
57
+
58
+ section_heading:
59
+ kind: session.info
60
+ payload:
61
+ level: level
62
+ title: title
63
+
64
+ table_output:
65
+ kind: tool.output
66
+ payload:
67
+ content: content
68
+
69
+ quoted_output:
70
+ kind: tool.output
71
+ payload:
72
+ content: content
@@ -0,0 +1,181 @@
1
+ # VS Code Copilot Chat — YAML mapping for traceforge
2
+ #
3
+ # Native source: VS Code's ChatModel journal, persisted line-by-line at
4
+ # %APPDATA%/Code/User/workspaceStorage/<hash>/chatSessions/<sessionId>.jsonl
5
+ # (version 3). Each line is a {kind, k, v} journal record. The `copilot_vscode`
6
+ # preprocessor replays the journal and expands each record into typed flat
7
+ # events keyed by `event_type` (see preprocessors/copilot_vscode.py).
8
+ #
9
+ # This is DISTINCT from copilot.yaml (the standalone Copilot CLI's
10
+ # ~/.copilot/session-state/<id>/events.jsonl stream) and from
11
+ # copilot_markdown.yaml (the CLI/editor session-store.db turns fallback).
12
+
13
+ framework: copilot_vscode
14
+ framework_version: "vscode-chat-v3"
15
+ ingestion_mode: file_watch
16
+ type_field: event_type
17
+ timestamp_field: timestamp
18
+ preprocessor: copilot_vscode
19
+ default_kind: raw
20
+
21
+ motivation:
22
+ sources:
23
+ - events: ["assistant_text"]
24
+ field: content
25
+ role: intent
26
+ - events: ["thinking"]
27
+ field: content
28
+ role: reasoning
29
+ targets: ["tool.call.completed"]
30
+
31
+ events:
32
+ # ── Session lifecycle ──────────────────────────────────────────────────────
33
+ session_started:
34
+ kind: session.started
35
+ payload:
36
+ session_id: session_id
37
+ version: version
38
+ responder: responder
39
+ initial_location: initial_location
40
+
41
+ # ── Messages ───────────────────────────────────────────────────────────────
42
+ user_message:
43
+ kind: message.user
44
+ payload:
45
+ content: text
46
+ request_id: request_id
47
+ model: model
48
+ agent: agent
49
+
50
+ # Markdown content parts (no `kind` discriminator) = assistant prose.
51
+ assistant_text:
52
+ kind: message.assistant
53
+ payload:
54
+ content: value
55
+ request_id: request_id
56
+ model: model
57
+
58
+ thinking:
59
+ kind: reasoning.started
60
+ payload:
61
+ content: value
62
+ reasoning_id: id
63
+ request_id: request_id
64
+
65
+ # ── Tool invocations ───────────────────────────────────────────────────────
66
+ # VS Code serializes the COMPLETED invocation (isComplete, results inline).
67
+ toolInvocationSerialized:
68
+ kind: tool.call.completed
69
+ payload:
70
+ tool_call_id: toolCallId
71
+ tool_name: toolId
72
+ invocation: invocationMessage.value
73
+ success: isComplete
74
+ command: toolSpecificData.commandLine
75
+ cwd: toolSpecificData.cwd
76
+ output: toolSpecificData.terminalCommandOutput
77
+ source: source.label
78
+ request_id: request_id
79
+ model: model
80
+
81
+ # ── File / edit surfaces ───────────────────────────────────────────────────
82
+ textEditGroup:
83
+ kind: file.edited
84
+ payload:
85
+ uri: uri
86
+ request_id: request_id
87
+
88
+ codeblockUri:
89
+ kind: file.read
90
+ payload:
91
+ uri: uri
92
+ request_id: request_id
93
+
94
+ inlineReference:
95
+ kind: file.read
96
+ payload:
97
+ reference: inlineReference
98
+ request_id: request_id
99
+
100
+ # ── MCP ────────────────────────────────────────────────────────────────────
101
+ mcpServersStarting:
102
+ kind: mcp.connection.started
103
+ payload:
104
+ request_id: request_id
105
+
106
+ # ── Edit checkpoints ───────────────────────────────────────────────────────
107
+ undoStop:
108
+ kind: checkpoint.created
109
+ payload:
110
+ undo_stop_id: id
111
+ request_id: request_id
112
+
113
+ # ── Additional VS Code chat part kinds ─────────────────────────────────────
114
+ # Proactively mapped (observed across VS Code chat versions but absent from the
115
+ # local dev sessions) so a one-shot paid capture won't trip the drift guard on
116
+ # a part type that simply didn't occur here. Missing nested fields resolve to
117
+ # None, so a sparse payload is harmless.
118
+ progressTaskSerialized:
119
+ kind: tool.progress
120
+ payload:
121
+ request_id: request_id
122
+
123
+ progressMessage:
124
+ kind: tool.progress
125
+ payload:
126
+ request_id: request_id
127
+
128
+ steering:
129
+ kind: input.received
130
+ payload:
131
+ request_id: request_id
132
+
133
+ command:
134
+ kind: command.started
135
+ payload:
136
+ command: command.commandId
137
+ request_id: request_id
138
+
139
+ warning:
140
+ kind: session.warning
141
+ payload:
142
+ content: value
143
+ request_id: request_id
144
+
145
+ confirmation:
146
+ kind: permission.requested
147
+ payload:
148
+ request_id: request_id
149
+
150
+ codeCitation:
151
+ kind: file.read
152
+ payload:
153
+ uri: value
154
+ request_id: request_id
155
+
156
+ markdownContent:
157
+ kind: message.assistant
158
+ payload:
159
+ content: value
160
+ request_id: request_id
161
+ model: model
162
+
163
+ treeData:
164
+ kind: tool.output
165
+ payload:
166
+ request_id: request_id
167
+
168
+ notebookEditGroup:
169
+ kind: file.edited
170
+ payload:
171
+ uri: uri
172
+ request_id: request_id
173
+
174
+ # ── Per-request completion ─────────────────────────────────────────────────
175
+ request_result:
176
+ kind: llm.call.completed
177
+ payload:
178
+ request_id: request_id
179
+ model: model
180
+ first_progress_ms: first_progress_ms
181
+ duration_ms: total_elapsed_ms