@pi-in-go/pigpen-ahp 0.1.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 (304) hide show
  1. package/CREDITS.md +27 -0
  2. package/LICENSE +23 -0
  3. package/README.md +148 -0
  4. package/extensions/ahp/access_options_test.go +116 -0
  5. package/extensions/ahp/extension.go +54 -0
  6. package/extensions/ahp/go.mod +12 -0
  7. package/extensions/ahp/go.sum +2 -0
  8. package/extensions/ahp/go.work +8 -0
  9. package/extensions/ahp/internal/channels/chat.go +110 -0
  10. package/extensions/ahp/internal/channels/root.go +32 -0
  11. package/extensions/ahp/internal/channels/session.go +128 -0
  12. package/extensions/ahp/internal/channels/session_test.go +108 -0
  13. package/extensions/ahp/internal/compose/compose.go +153 -0
  14. package/extensions/ahp/internal/compose/compose_test.go +120 -0
  15. package/extensions/ahp/internal/gaps/gaps_test.go +88 -0
  16. package/extensions/ahp/internal/host/handshake_test.go +206 -0
  17. package/extensions/ahp/internal/host/host.go +1305 -0
  18. package/extensions/ahp/internal/host/reconnect_test.go +197 -0
  19. package/extensions/ahp/internal/host/replaywindow_test.go +31 -0
  20. package/extensions/ahp/internal/host/schema_test.go +79 -0
  21. package/extensions/ahp/internal/host/store.go +291 -0
  22. package/extensions/ahp/internal/host/store_update_test.go +85 -0
  23. package/extensions/ahp/internal/host/subscriptions_test.go +160 -0
  24. package/extensions/ahp/internal/host/surface_test.go +95 -0
  25. package/extensions/ahp/internal/host/workarounds.go +458 -0
  26. package/extensions/ahp/internal/host/workarounds_test.go +96 -0
  27. package/extensions/ahp/internal/live/live.go +328 -0
  28. package/extensions/ahp/internal/live/live_test.go +91 -0
  29. package/extensions/ahp/internal/live/store.go +113 -0
  30. package/extensions/ahp/internal/mapper/activity.go +199 -0
  31. package/extensions/ahp/internal/mapper/activity_test.go +188 -0
  32. package/extensions/ahp/internal/mapper/bench_test.go +38 -0
  33. package/extensions/ahp/internal/mapper/event_mapper_test.go +380 -0
  34. package/extensions/ahp/internal/mapper/fixtures_test.go +387 -0
  35. package/extensions/ahp/internal/mapper/helpers_test.go +251 -0
  36. package/extensions/ahp/internal/mapper/js.go +131 -0
  37. package/extensions/ahp/internal/mapper/mapper.go +600 -0
  38. package/extensions/ahp/internal/mapper/message_input_test.go +196 -0
  39. package/extensions/ahp/internal/mapper/messageinput.go +272 -0
  40. package/extensions/ahp/internal/mapper/schema_helpers_test.go +5 -0
  41. package/extensions/ahp/internal/mapper/testdata/LICENSE-pi-ahp +21 -0
  42. package/extensions/ahp/internal/mapper/testdata/fixtures/abort.json +711 -0
  43. package/extensions/ahp/internal/mapper/testdata/fixtures/bash-long-output.json +1312 -0
  44. package/extensions/ahp/internal/mapper/testdata/fixtures/compaction.json +6285 -0
  45. package/extensions/ahp/internal/mapper/testdata/fixtures/parallel-tools.json +2622 -0
  46. package/extensions/ahp/internal/mapper/testdata/fixtures/plain-text.json +1856 -0
  47. package/extensions/ahp/internal/mapper/testdata/fixtures/single-tool.json +1128 -0
  48. package/extensions/ahp/internal/mapper/testdata/fixtures/steering.json +3926 -0
  49. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-bash.json +2372 -0
  50. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-edit.json +3983 -0
  51. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-error.json +2850 -0
  52. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-find.json +1162 -0
  53. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-grep.json +2783 -0
  54. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-loop.json +1693 -0
  55. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-ls.json +2427 -0
  56. package/extensions/ahp/internal/mapper/testdata/fixtures/tool-write.json +1271 -0
  57. package/extensions/ahp/internal/mapper/title.go +34 -0
  58. package/extensions/ahp/internal/mapper/usermsg.go +87 -0
  59. package/extensions/ahp/internal/pi/activeturn_test.go +296 -0
  60. package/extensions/ahp/internal/pi/backend.go +64 -0
  61. package/extensions/ahp/internal/pi/catalogue.go +370 -0
  62. package/extensions/ahp/internal/pi/catalogue_test.go +271 -0
  63. package/extensions/ahp/internal/pi/chatdriver.go +533 -0
  64. package/extensions/ahp/internal/pi/chatdriver_test.go +416 -0
  65. package/extensions/ahp/internal/pi/clientactions.go +212 -0
  66. package/extensions/ahp/internal/pi/clientactions_test.go +273 -0
  67. package/extensions/ahp/internal/pi/completions.go +230 -0
  68. package/extensions/ahp/internal/pi/completions_test.go +272 -0
  69. package/extensions/ahp/internal/pi/config_test.go +269 -0
  70. package/extensions/ahp/internal/pi/deletesession.go +69 -0
  71. package/extensions/ahp/internal/pi/deletesession_test.go +153 -0
  72. package/extensions/ahp/internal/pi/disposal_test.go +362 -0
  73. package/extensions/ahp/internal/pi/fixture_test.go +308 -0
  74. package/extensions/ahp/internal/pi/foreign_test.go +122 -0
  75. package/extensions/ahp/internal/pi/harness_test.go +83 -0
  76. package/extensions/ahp/internal/pi/history.go +269 -0
  77. package/extensions/ahp/internal/pi/hydrated_test.go +171 -0
  78. package/extensions/ahp/internal/pi/hydratedlifecycle_test.go +196 -0
  79. package/extensions/ahp/internal/pi/hydration_test.go +209 -0
  80. package/extensions/ahp/internal/pi/hydrator.go +212 -0
  81. package/extensions/ahp/internal/pi/imageinput.go +224 -0
  82. package/extensions/ahp/internal/pi/imageinput_test.go +57 -0
  83. package/extensions/ahp/internal/pi/lifecycle_test.go +381 -0
  84. package/extensions/ahp/internal/pi/models.go +212 -0
  85. package/extensions/ahp/internal/pi/models_test.go +128 -0
  86. package/extensions/ahp/internal/pi/paging.go +95 -0
  87. package/extensions/ahp/internal/pi/pagingtruncate_test.go +323 -0
  88. package/extensions/ahp/internal/pi/projecttrust.go +222 -0
  89. package/extensions/ahp/internal/pi/registry.go +924 -0
  90. package/extensions/ahp/internal/pi/restart_test.go +185 -0
  91. package/extensions/ahp/internal/pi/services.go +70 -0
  92. package/extensions/ahp/internal/pi/sessionconfig.go +64 -0
  93. package/extensions/ahp/internal/pi/sessionfiles_test.go +74 -0
  94. package/extensions/ahp/internal/pi/sessionstore.go +83 -0
  95. package/extensions/ahp/internal/pi/summary_test.go +426 -0
  96. package/extensions/ahp/internal/pi/workarounds_wire_test.go +208 -0
  97. package/extensions/ahp/internal/pisession/fromentries_test.go +32 -0
  98. package/extensions/ahp/internal/pisession/json.go +31 -0
  99. package/extensions/ahp/internal/pisession/pisession.go +580 -0
  100. package/extensions/ahp/internal/settings/access.go +63 -0
  101. package/extensions/ahp/internal/settings/access_test.go +52 -0
  102. package/extensions/ahp/internal/settings/settings.go +117 -0
  103. package/extensions/ahp/internal/settings/settings_test.go +104 -0
  104. package/extensions/ahp/internal/svc/etag_other.go +15 -0
  105. package/extensions/ahp/internal/svc/etag_unix.go +34 -0
  106. package/extensions/ahp/internal/svc/glob.go +197 -0
  107. package/extensions/ahp/internal/svc/mime.go +37 -0
  108. package/extensions/ahp/internal/svc/paths.go +108 -0
  109. package/extensions/ahp/internal/svc/pty.go +64 -0
  110. package/extensions/ahp/internal/svc/pty_darwin.go +42 -0
  111. package/extensions/ahp/internal/svc/pty_linux.go +36 -0
  112. package/extensions/ahp/internal/svc/pty_other.go +9 -0
  113. package/extensions/ahp/internal/svc/pty_test.go +114 -0
  114. package/extensions/ahp/internal/svc/pty_unix.go +147 -0
  115. package/extensions/ahp/internal/svc/resource.go +495 -0
  116. package/extensions/ahp/internal/svc/resource_test.go +501 -0
  117. package/extensions/ahp/internal/svc/stat_bsd.go +9 -0
  118. package/extensions/ahp/internal/svc/stat_linux.go +9 -0
  119. package/extensions/ahp/internal/svc/terminal.go +454 -0
  120. package/extensions/ahp/internal/svc/terminal_test.go +512 -0
  121. package/extensions/ahp/internal/svc/watch.go +590 -0
  122. package/extensions/ahp/internal/svc/watch_test.go +627 -0
  123. package/extensions/ahp/internal/svc/watchevents_test.go +452 -0
  124. package/extensions/ahp/internal/svc/watchpolicy.go +81 -0
  125. package/extensions/ahp/internal/svc/watchpolicy_test.go +151 -0
  126. package/extensions/ahp/internal/svc/watchracy_test.go +61 -0
  127. package/extensions/ahp/internal/testkit/schema/LICENSE-agent-host-protocol +21 -0
  128. package/extensions/ahp/internal/testkit/schema/actions.schema.json +9208 -0
  129. package/extensions/ahp/internal/testkit/schema/commands.schema.json +10862 -0
  130. package/extensions/ahp/internal/testkit/schema/errors.schema.json +10928 -0
  131. package/extensions/ahp/internal/testkit/schema/notifications.schema.json +6667 -0
  132. package/extensions/ahp/internal/testkit/schema/state.schema.json +6392 -0
  133. package/extensions/ahp/internal/testkit/schema.go +360 -0
  134. package/extensions/ahp/internal/testkit/testkit.go +367 -0
  135. package/extensions/ahp/internal/twin/twin.go +27 -0
  136. package/extensions/ahp/internal/wire/dispatchable.go +106 -0
  137. package/extensions/ahp/internal/wire/dispatchable_list.go +15 -0
  138. package/extensions/ahp/internal/wire/helpers_test.go +5 -0
  139. package/extensions/ahp/internal/wire/wire.go +218 -0
  140. package/extensions/ahp/internal/wire/wire_test.go +123 -0
  141. package/extensions/ahp/internal/ws/helpers_test.go +7 -0
  142. package/extensions/ahp/internal/ws/vscode_test.go +198 -0
  143. package/extensions/ahp/internal/ws/ws.go +674 -0
  144. package/extensions/ahp/internal/ws/ws_test.go +324 -0
  145. package/extensions/ahp/realpig_test.go +589 -0
  146. package/extensions/ahp/runtime.go +311 -0
  147. package/extensions/ahp/runtime_test.go +110 -0
  148. package/extensions/ahp/testdata/upstream-tests.json +3833 -0
  149. package/extensions/ahp/third_party/agent-host-protocol-go/LICENSE +21 -0
  150. package/extensions/ahp/third_party/agent-host-protocol-go/NOTICE-PIGPEN.md +18 -0
  151. package/extensions/ahp/third_party/agent-host-protocol-go/ahp/client.go +1011 -0
  152. package/extensions/ahp/third_party/agent-host-protocol-go/ahp/error.go +111 -0
  153. package/extensions/ahp/third_party/agent-host-protocol-go/ahp/multi_host_state_mirror.go +239 -0
  154. package/extensions/ahp/third_party/agent-host-protocol-go/ahp/reducers.go +1939 -0
  155. package/extensions/ahp/third_party/agent-host-protocol-go/ahp/transport.go +176 -0
  156. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/actions.generated.go +2447 -0
  157. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/commands.generated.go +1546 -0
  158. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/common.go +205 -0
  159. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/errors.generated.go +65 -0
  160. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/messages.generated.go +138 -0
  161. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/notifications.generated.go +264 -0
  162. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/state.generated.go +6171 -0
  163. package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/version.generated.go +31 -0
  164. package/extensions/ahp/third_party/agent-host-protocol-go/go.mod +3 -0
  165. package/extensions/ahp/twins_test.go +91 -0
  166. package/package.json +40 -0
  167. package/proof/PORT.md +121 -0
  168. package/proof/mutations.json +152 -0
  169. package/proof/oracle/LICENSE +21 -0
  170. package/proof/oracle/README.md +120 -0
  171. package/proof/oracle/UPSTREAM.md +7 -0
  172. package/proof/oracle/package.json +68 -0
  173. package/proof/oracle/src/bin/cli.ts +66 -0
  174. package/proof/oracle/src/bin/tunnel.ts +128 -0
  175. package/proof/oracle/src/channels/chat.ts +134 -0
  176. package/proof/oracle/src/channels/root.ts +39 -0
  177. package/proof/oracle/src/channels/session.ts +118 -0
  178. package/proof/oracle/src/channels/terminal.ts +11 -0
  179. package/proof/oracle/src/core/channels.ts +108 -0
  180. package/proof/oracle/src/core/client-workarounds.ts +358 -0
  181. package/proof/oracle/src/core/connection.ts +41 -0
  182. package/proof/oracle/src/core/host.ts +882 -0
  183. package/proof/oracle/src/core/sequencer.ts +75 -0
  184. package/proof/oracle/src/core/state-store.ts +162 -0
  185. package/proof/oracle/src/core/uri.ts +25 -0
  186. package/proof/oracle/src/host/direct-settings.ts +110 -0
  187. package/proof/oracle/src/host/pi-host.ts +220 -0
  188. package/proof/oracle/src/host/serve.ts +71 -0
  189. package/proof/oracle/src/host/terminal-service.ts +346 -0
  190. package/proof/oracle/src/pi/activity.ts +171 -0
  191. package/proof/oracle/src/pi/changeset-service.ts +646 -0
  192. package/proof/oracle/src/pi/changeset-uri.ts +64 -0
  193. package/proof/oracle/src/pi/chat-driver.ts +529 -0
  194. package/proof/oracle/src/pi/completions.ts +160 -0
  195. package/proof/oracle/src/pi/delete-session.ts +53 -0
  196. package/proof/oracle/src/pi/event-mapper.ts +648 -0
  197. package/proof/oracle/src/pi/git-changes.ts +605 -0
  198. package/proof/oracle/src/pi/history.ts +305 -0
  199. package/proof/oracle/src/pi/image-input.ts +56 -0
  200. package/proof/oracle/src/pi/image-mime.ts +8 -0
  201. package/proof/oracle/src/pi/in-process-backend.ts +155 -0
  202. package/proof/oracle/src/pi/message-input.ts +212 -0
  203. package/proof/oracle/src/pi/models.ts +124 -0
  204. package/proof/oracle/src/pi/project-trust.ts +66 -0
  205. package/proof/oracle/src/pi/provider.ts +2 -0
  206. package/proof/oracle/src/pi/resource-paths.ts +80 -0
  207. package/proof/oracle/src/pi/resource-service.ts +356 -0
  208. package/proof/oracle/src/pi/resource-watch-policy.ts +35 -0
  209. package/proof/oracle/src/pi/resource-watch.ts +357 -0
  210. package/proof/oracle/src/pi/session-catalogue.ts +318 -0
  211. package/proof/oracle/src/pi/session-config.ts +84 -0
  212. package/proof/oracle/src/pi/session-history.ts +75 -0
  213. package/proof/oracle/src/pi/session-hydrator.ts +219 -0
  214. package/proof/oracle/src/pi/session-registry.ts +815 -0
  215. package/proof/oracle/src/pi/session-storage.ts +29 -0
  216. package/proof/oracle/src/pi/session-title.ts +18 -0
  217. package/proof/oracle/src/pi/turn-paging.ts +94 -0
  218. package/proof/oracle/src/pi/user-message.ts +66 -0
  219. package/proof/oracle/src/protocol/errors.ts +44 -0
  220. package/proof/oracle/src/protocol/jsonrpc.ts +89 -0
  221. package/proof/oracle/src/protocol/version.ts +39 -0
  222. package/proof/oracle/src/transport/websocket.ts +136 -0
  223. package/proof/oracle/src/tunnel/devtunnel.ts +293 -0
  224. package/proof/oracle/src/tunnel/discovery.ts +37 -0
  225. package/proof/oracle/test/active-turn-reconnect.test.ts +274 -0
  226. package/proof/oracle/test/activity.test.ts +171 -0
  227. package/proof/oracle/test/changeset-lifecycle.test.serial.ts +303 -0
  228. package/proof/oracle/test/changeset-uri.test.ts +37 -0
  229. package/proof/oracle/test/changeset.test.serial.ts +487 -0
  230. package/proof/oracle/test/chat-driver.test.ts +691 -0
  231. package/proof/oracle/test/client-actions.test.ts +409 -0
  232. package/proof/oracle/test/client-workarounds.test.ts +320 -0
  233. package/proof/oracle/test/completions.test.ts +323 -0
  234. package/proof/oracle/test/delete-session.test.ts +142 -0
  235. package/proof/oracle/test/direct-settings.test.ts +81 -0
  236. package/proof/oracle/test/event-mapper.test.ts +619 -0
  237. package/proof/oracle/test/fetch-turns.test.ts +207 -0
  238. package/proof/oracle/test/fixtures/abort.json +711 -0
  239. package/proof/oracle/test/fixtures/bash-long-output.json +1312 -0
  240. package/proof/oracle/test/fixtures/compaction.json +6285 -0
  241. package/proof/oracle/test/fixtures/parallel-tools.json +2622 -0
  242. package/proof/oracle/test/fixtures/plain-text.json +1856 -0
  243. package/proof/oracle/test/fixtures/single-tool.json +1128 -0
  244. package/proof/oracle/test/fixtures/steering.json +3926 -0
  245. package/proof/oracle/test/fixtures/tool-bash.json +2372 -0
  246. package/proof/oracle/test/fixtures/tool-edit.json +3983 -0
  247. package/proof/oracle/test/fixtures/tool-error.json +2850 -0
  248. package/proof/oracle/test/fixtures/tool-find.json +1162 -0
  249. package/proof/oracle/test/fixtures/tool-grep.json +2783 -0
  250. package/proof/oracle/test/fixtures/tool-loop.json +1693 -0
  251. package/proof/oracle/test/fixtures/tool-ls.json +2427 -0
  252. package/proof/oracle/test/fixtures/tool-write.json +1271 -0
  253. package/proof/oracle/test/handshake.test.ts +275 -0
  254. package/proof/oracle/test/harness.ts +153 -0
  255. package/proof/oracle/test/hydrated-session-lifecycle.test.ts +211 -0
  256. package/proof/oracle/test/image-input.test.ts +28 -0
  257. package/proof/oracle/test/image-session.test.ts +69 -0
  258. package/proof/oracle/test/live-turn.test.ts +304 -0
  259. package/proof/oracle/test/mapper-fixtures.test.ts +293 -0
  260. package/proof/oracle/test/message-input.test.ts +181 -0
  261. package/proof/oracle/test/model-discovery.test.ts +170 -0
  262. package/proof/oracle/test/models.test.ts +109 -0
  263. package/proof/oracle/test/pi-host.test.ts +91 -0
  264. package/proof/oracle/test/pi-replay.test.ts +141 -0
  265. package/proof/oracle/test/project-trust.test.ts +125 -0
  266. package/proof/oracle/test/protocol-surface.test.ts +121 -0
  267. package/proof/oracle/test/pty.test.ts +100 -0
  268. package/proof/oracle/test/reconnect.test.ts +389 -0
  269. package/proof/oracle/test/resource-watch-policy.test.ts +78 -0
  270. package/proof/oracle/test/resource-watch.test.serial.ts +536 -0
  271. package/proof/oracle/test/resource.test.ts +499 -0
  272. package/proof/oracle/test/schema.test.ts +88 -0
  273. package/proof/oracle/test/session-catalogue.test.ts +314 -0
  274. package/proof/oracle/test/session-config.test.ts +224 -0
  275. package/proof/oracle/test/session-disposal.test.ts +364 -0
  276. package/proof/oracle/test/session-hydration.test.ts +194 -0
  277. package/proof/oracle/test/session-lifecycle.test.ts +416 -0
  278. package/proof/oracle/test/session-storage.test.serial.ts +32 -0
  279. package/proof/oracle/test/session-summary.test.ts +418 -0
  280. package/proof/oracle/test/subscriptions.test.ts +198 -0
  281. package/proof/oracle/test/support/assertions.ts +32 -0
  282. package/proof/oracle/test/support/async.ts +26 -0
  283. package/proof/oracle/test/support/hydrated-session.ts +205 -0
  284. package/proof/oracle/test/support/images.ts +8 -0
  285. package/proof/oracle/test/support/recorded-fixtures.ts +60 -0
  286. package/proof/oracle/test/support/recorded-scenarios.ts +145 -0
  287. package/proof/oracle/test/support/replay.ts +194 -0
  288. package/proof/oracle/test/support/schema.ts +221 -0
  289. package/proof/oracle/test/support/session-files.ts +12 -0
  290. package/proof/oracle/test/support/session-storage.ts +22 -0
  291. package/proof/oracle/test/support/upstream.ts +25 -0
  292. package/proof/oracle/test/support/watch-events.ts +108 -0
  293. package/proof/oracle/test/terminal-service.test.ts +495 -0
  294. package/proof/oracle/test/truncate.test.ts +230 -0
  295. package/proof/oracle/test/tunnel.test.ts +258 -0
  296. package/proof/oracle/test/upstream-workarounds.test.ts +37 -0
  297. package/proof/oracle/test/uri.test.ts +24 -0
  298. package/proof/oracle/test/watch-events.test.ts +118 -0
  299. package/proof/oracle/tsconfig.json +32 -0
  300. package/proof/proof-piglet/piglet.yaml +18 -0
  301. package/proof/tools/fakellm/go.mod +3 -0
  302. package/proof/tools/fakellm/main.go +109 -0
  303. package/proof/tools/gen-dispatchable.py +30 -0
  304. package/provenance.json +28 -0
@@ -0,0 +1,3833 @@
1
+ [
2
+ {
3
+ "file": "active-turn-reconnect",
4
+ "serial": false,
5
+ "suite": [
6
+ "active-turn reconnect"
7
+ ],
8
+ "title": "replays offline output and accepts steering and cancellation after reconnect",
9
+ "ok": true
10
+ },
11
+ {
12
+ "file": "active-turn-reconnect",
13
+ "serial": false,
14
+ "suite": [
15
+ "active-turn reconnect"
16
+ ],
17
+ "title": "replays a turn that completed while its client was offline",
18
+ "ok": true
19
+ },
20
+ {
21
+ "file": "active-turn-reconnect",
22
+ "serial": false,
23
+ "suite": [
24
+ "active-turn reconnect"
25
+ ],
26
+ "title": "falls back to an active-turn snapshot and continues streaming",
27
+ "ok": true
28
+ },
29
+ {
30
+ "file": "activity",
31
+ "serial": false,
32
+ "suite": [
33
+ "activity descriptions"
34
+ ],
35
+ "title": "names the file a read touches",
36
+ "ok": true
37
+ },
38
+ {
39
+ "file": "activity",
40
+ "serial": false,
41
+ "suite": [
42
+ "activity descriptions"
43
+ ],
44
+ "title": "renders paths relative to the workspace",
45
+ "ok": true
46
+ },
47
+ {
48
+ "file": "activity",
49
+ "serial": false,
50
+ "suite": [
51
+ "activity descriptions"
52
+ ],
53
+ "title": "shows the command a bash call runs",
54
+ "ok": true
55
+ },
56
+ {
57
+ "file": "activity",
58
+ "serial": false,
59
+ "suite": [
60
+ "activity descriptions"
61
+ ],
62
+ "title": "shortens the middle, keeping both informative ends",
63
+ "ok": true
64
+ },
65
+ {
66
+ "file": "activity",
67
+ "serial": false,
68
+ "suite": [
69
+ "activity descriptions"
70
+ ],
71
+ "title": "falls back to the tool's own name",
72
+ "ok": true
73
+ },
74
+ {
75
+ "file": "activity",
76
+ "serial": false,
77
+ "suite": [
78
+ "activity descriptions"
79
+ ],
80
+ "title": "copes with missing arguments",
81
+ "ok": true
82
+ },
83
+ {
84
+ "file": "activity",
85
+ "serial": false,
86
+ "suite": [
87
+ "activity over a turn"
88
+ ],
89
+ "title": "tracks thinking, tools, and responding in order",
90
+ "ok": true
91
+ },
92
+ {
93
+ "file": "activity",
94
+ "serial": false,
95
+ "suite": [
96
+ "activity over a turn"
97
+ ],
98
+ "title": "clears the description when the turn ends",
99
+ "ok": true
100
+ },
101
+ {
102
+ "file": "activity",
103
+ "serial": false,
104
+ "suite": [
105
+ "activity over a turn"
106
+ ],
107
+ "title": "clears it on a cancelled turn too",
108
+ "ok": true
109
+ },
110
+ {
111
+ "file": "activity",
112
+ "serial": false,
113
+ "suite": [
114
+ "activity over a turn"
115
+ ],
116
+ "title": "does not re-send an unchanged description",
117
+ "ok": true
118
+ },
119
+ {
120
+ "file": "activity",
121
+ "serial": false,
122
+ "suite": [
123
+ "activity over a turn"
124
+ ],
125
+ "title": "emits schema-conforming actions",
126
+ "ok": true
127
+ },
128
+ {
129
+ "file": "activity",
130
+ "serial": false,
131
+ "suite": [
132
+ "activity over a turn",
133
+ "toolInputFor"
134
+ ],
135
+ "title": "shows the one argument a call is about",
136
+ "ok": true
137
+ },
138
+ {
139
+ "file": "activity",
140
+ "serial": false,
141
+ "suite": [
142
+ "activity over a turn",
143
+ "toolInputFor"
144
+ ],
145
+ "title": "keeps a search's scope, and drops the defaults models restate",
146
+ "ok": true
147
+ },
148
+ {
149
+ "file": "activity",
150
+ "serial": false,
151
+ "suite": [
152
+ "activity over a turn",
153
+ "toolInputFor"
154
+ ],
155
+ "title": "falls back to the arguments for a tool it does not know",
156
+ "ok": true
157
+ },
158
+ {
159
+ "file": "changeset-lifecycle",
160
+ "serial": true,
161
+ "suite": [],
162
+ "title": "observes changes during the initial scan and rebuilds changed ignore rules",
163
+ "ok": true
164
+ },
165
+ {
166
+ "file": "changeset-lifecycle",
167
+ "serial": true,
168
+ "suite": [],
169
+ "title": "refreshes file changes while a turn is still active",
170
+ "ok": true
171
+ },
172
+ {
173
+ "file": "changeset-lifecycle",
174
+ "serial": true,
175
+ "suite": [],
176
+ "title": "does not recursively watch when ignored paths cannot be determined",
177
+ "ok": true
178
+ },
179
+ {
180
+ "file": "changeset-lifecycle",
181
+ "serial": true,
182
+ "suite": [],
183
+ "title": "publishes an explicit error when Git cannot compute the changeset",
184
+ "ok": true
185
+ },
186
+ {
187
+ "file": "changeset-lifecycle",
188
+ "serial": true,
189
+ "suite": [],
190
+ "title": "drains an in-flight scan before deleting its channel",
191
+ "ok": true
192
+ },
193
+ {
194
+ "file": "changeset-uri",
195
+ "serial": false,
196
+ "suite": [
197
+ "pi changeset URIs"
198
+ ],
199
+ "title": "builds stable static catalogue channels",
200
+ "ok": true
201
+ },
202
+ {
203
+ "file": "changeset-uri",
204
+ "serial": false,
205
+ "suite": [
206
+ "pi changeset URIs"
207
+ ],
208
+ "title": "rejects channels the host did not advertise",
209
+ "ok": true
210
+ },
211
+ {
212
+ "file": "changeset",
213
+ "serial": true,
214
+ "suite": [
215
+ "Git changesets"
216
+ ],
217
+ "title": "keeps the latest commit separate from uncommitted work and refreshes it",
218
+ "ok": true
219
+ },
220
+ {
221
+ "file": "changeset",
222
+ "serial": true,
223
+ "suite": [
224
+ "Git changesets"
225
+ ],
226
+ "title": "limits changes to the session working-directory subtree",
227
+ "ok": true
228
+ },
229
+ {
230
+ "file": "changeset",
231
+ "serial": true,
232
+ "suite": [
233
+ "Git changesets"
234
+ ],
235
+ "title": "ignores ambient Git repository overrides",
236
+ "ok": true
237
+ },
238
+ {
239
+ "file": "changeset",
240
+ "serial": true,
241
+ "suite": [
242
+ "Git changesets"
243
+ ],
244
+ "title": "omits changesets when Git is unavailable",
245
+ "ok": true
246
+ },
247
+ {
248
+ "file": "changeset",
249
+ "serial": true,
250
+ "suite": [
251
+ "Git changesets"
252
+ ],
253
+ "title": "omits changesets outside Git workspaces",
254
+ "ok": true
255
+ },
256
+ {
257
+ "file": "changeset",
258
+ "serial": true,
259
+ "suite": [
260
+ "Git changesets"
261
+ ],
262
+ "title": "omits Latest Commit before the repository has a commit",
263
+ "ok": true
264
+ },
265
+ {
266
+ "file": "changeset",
267
+ "serial": true,
268
+ "suite": [],
269
+ "title": "resumes changeset updates when durable session deletion fails",
270
+ "ok": true
271
+ },
272
+ {
273
+ "file": "changeset",
274
+ "serial": true,
275
+ "suite": [],
276
+ "title": "hydrates the parent session when its changeset is subscribed directly",
277
+ "ok": true
278
+ },
279
+ {
280
+ "file": "chat-driver",
281
+ "serial": false,
282
+ "suite": [
283
+ "chat driver"
284
+ ],
285
+ "title": "creates the session's default chat and points defaultChat at it",
286
+ "ok": true
287
+ },
288
+ {
289
+ "file": "chat-driver",
290
+ "serial": false,
291
+ "suite": [
292
+ "chat driver"
293
+ ],
294
+ "title": "runs a client turn through the backend and streams the reply back",
295
+ "ok": true
296
+ },
297
+ {
298
+ "file": "chat-driver",
299
+ "serial": false,
300
+ "suite": [
301
+ "chat driver"
302
+ ],
303
+ "title": "adapts supported attachments into pi prompt text",
304
+ "ok": true
305
+ },
306
+ {
307
+ "file": "chat-driver",
308
+ "serial": false,
309
+ "suite": [
310
+ "chat driver"
311
+ ],
312
+ "title": "keeps the session catalog's chat summary in step",
313
+ "ok": true
314
+ },
315
+ {
316
+ "file": "chat-driver",
317
+ "serial": false,
318
+ "suite": [
319
+ "chat driver"
320
+ ],
321
+ "title": "forwards steering text and images to the active backend",
322
+ "ok": true
323
+ },
324
+ {
325
+ "file": "chat-driver",
326
+ "serial": false,
327
+ "suite": [
328
+ "chat driver"
329
+ ],
330
+ "title": "consumes a queued message as its own turn once the chat goes idle",
331
+ "ok": true
332
+ },
333
+ {
334
+ "file": "chat-driver",
335
+ "serial": false,
336
+ "suite": [
337
+ "chat driver"
338
+ ],
339
+ "title": "holds a queued message until the active turn settles",
340
+ "ok": true
341
+ },
342
+ {
343
+ "file": "chat-driver",
344
+ "serial": false,
345
+ "suite": [
346
+ "chat driver"
347
+ ],
348
+ "title": "does not start a prompt cancelled during model selection",
349
+ "ok": true
350
+ },
351
+ {
352
+ "file": "chat-driver",
353
+ "serial": false,
354
+ "suite": [
355
+ "chat driver"
356
+ ],
357
+ "title": "does not run a prompt cancelled during backend preflight",
358
+ "ok": true
359
+ },
360
+ {
361
+ "file": "chat-driver",
362
+ "serial": false,
363
+ "suite": [
364
+ "chat driver"
365
+ ],
366
+ "title": "anchors a cancelled turn before resuming queued work",
367
+ "ok": true
368
+ },
369
+ {
370
+ "file": "chat-driver",
371
+ "serial": false,
372
+ "suite": [
373
+ "chat driver \u2014 backend failure"
374
+ ],
375
+ "title": "marks the session failed when the backend cannot start",
376
+ "ok": true
377
+ },
378
+ {
379
+ "file": "chat-driver",
380
+ "serial": false,
381
+ "suite": [
382
+ "chat driver \u2014 backend failure"
383
+ ],
384
+ "title": "closes the turn when prompt() rejects before any agent event",
385
+ "ok": true
386
+ },
387
+ {
388
+ "file": "chat-driver",
389
+ "serial": false,
390
+ "suite": [
391
+ "steering message lifetime"
392
+ ],
393
+ "title": "clears the pending message once pi consumes it",
394
+ "ok": true
395
+ },
396
+ {
397
+ "file": "client-actions",
398
+ "serial": false,
399
+ "suite": [
400
+ "pi client-action policy"
401
+ ],
402
+ "title": "accounts for every client action on channels this host serves",
403
+ "ok": true
404
+ },
405
+ {
406
+ "file": "client-actions",
407
+ "serial": false,
408
+ "suite": [
409
+ "pi client-action policy"
410
+ ],
411
+ "title": "rejects actions addressed to the wrong channel kind",
412
+ "ok": true
413
+ },
414
+ {
415
+ "file": "client-actions",
416
+ "serial": false,
417
+ "suite": [
418
+ "pi client-action policy"
419
+ ],
420
+ "title": "rejects capabilities pi does not implement",
421
+ "ok": true
422
+ },
423
+ {
424
+ "file": "client-actions",
425
+ "serial": false,
426
+ "suite": [
427
+ "pi client-action policy"
428
+ ],
429
+ "title": "rejects malformed supported actions without mutating state",
430
+ "ok": true
431
+ },
432
+ {
433
+ "file": "client-actions",
434
+ "serial": false,
435
+ "suite": [
436
+ "pi client-action policy"
437
+ ],
438
+ "title": "validates turn and user-message invariants",
439
+ "ok": true
440
+ },
441
+ {
442
+ "file": "client-actions",
443
+ "serial": false,
444
+ "suite": [
445
+ "pi client-action policy"
446
+ ],
447
+ "title": "keeps state-only draft and queued-message actions",
448
+ "ok": true
449
+ },
450
+ {
451
+ "file": "client-workarounds",
452
+ "serial": false,
453
+ "suite": [
454
+ "client URI dialects over the wire"
455
+ ],
456
+ "title": "answers VS Code at the URIs it computes for itself",
457
+ "ok": true
458
+ },
459
+ {
460
+ "file": "client-workarounds",
461
+ "serial": false,
462
+ "suite": [
463
+ "client URI dialects over the wire"
464
+ ],
465
+ "title": "applies the VS Code dialect to initialize-time subscriptions",
466
+ "ok": true
467
+ },
468
+ {
469
+ "file": "client-workarounds",
470
+ "serial": false,
471
+ "suite": [
472
+ "client URI dialects over the wire"
473
+ ],
474
+ "title": "applies the unnamed provider-alias client dialect to initialize-time subscriptions",
475
+ "ok": true
476
+ },
477
+ {
478
+ "file": "client-workarounds",
479
+ "serial": false,
480
+ "suite": [
481
+ "VS Code session disposal workaround"
482
+ ],
483
+ "title": "protects a durable session that this connection did not create",
484
+ "ok": true
485
+ },
486
+ {
487
+ "file": "client-workarounds",
488
+ "serial": false,
489
+ "suite": [
490
+ "VS Code session disposal workaround"
491
+ ],
492
+ "title": "still disposes an empty session created by this VS Code connection",
493
+ "ok": true
494
+ },
495
+ {
496
+ "file": "client-workarounds",
497
+ "serial": false,
498
+ "suite": [
499
+ "VS Code session disposal workaround"
500
+ ],
501
+ "title": "restores an empty session after disposal fails so VS Code can retry",
502
+ "ok": true
503
+ },
504
+ {
505
+ "file": "client-workarounds",
506
+ "serial": false,
507
+ "suite": [
508
+ "VS Code session disposal workaround"
509
+ ],
510
+ "title": "protects a session after its first turn starts",
511
+ "ok": true
512
+ },
513
+ {
514
+ "file": "client-workarounds",
515
+ "serial": false,
516
+ "suite": [
517
+ "session URI classification"
518
+ ],
519
+ "title": "recognises only canonical or explicitly allowed session schemes",
520
+ "ok": true
521
+ },
522
+ {
523
+ "file": "client-workarounds",
524
+ "serial": false,
525
+ "suite": [
526
+ "session URI classification"
527
+ ],
528
+ "title": "does not infer sessions from other channel schemes",
529
+ "ok": true
530
+ },
531
+ {
532
+ "file": "client-workarounds",
533
+ "serial": false,
534
+ "suite": [
535
+ "session URI classification"
536
+ ],
537
+ "title": "retargets VS Code's chat-addressed rename to the owning session",
538
+ "ok": true
539
+ },
540
+ {
541
+ "file": "client-workarounds",
542
+ "serial": false,
543
+ "suite": [
544
+ "session URI classification"
545
+ ],
546
+ "title": "rewrites URI-bearing action and catalogue fields for VS Code",
547
+ "ok": true
548
+ },
549
+ {
550
+ "file": "client-workarounds",
551
+ "serial": false,
552
+ "suite": [
553
+ "session URI classification"
554
+ ],
555
+ "title": "leaves VS Code's client-chosen terminal URI outside session translation",
556
+ "ok": true
557
+ },
558
+ {
559
+ "file": "client-workarounds",
560
+ "serial": false,
561
+ "suite": [
562
+ "session URI classification"
563
+ ],
564
+ "title": "does not hydrate or dispose a durable session through VS Code's terminal URI",
565
+ "ok": true
566
+ },
567
+ {
568
+ "file": "client-workarounds",
569
+ "serial": false,
570
+ "suite": [
571
+ "session URI classification"
572
+ ],
573
+ "title": "accepts the provider scheme but rejects an undeclared session scheme",
574
+ "ok": true
575
+ },
576
+ {
577
+ "file": "completions",
578
+ "serial": false,
579
+ "suite": [
580
+ "mention parsing"
581
+ ],
582
+ "title": "finds a mention the cursor sits in",
583
+ "ok": true
584
+ },
585
+ {
586
+ "file": "completions",
587
+ "serial": false,
588
+ "suite": [
589
+ "mention parsing"
590
+ ],
591
+ "title": "finds a bare mention at the start of the text",
592
+ "ok": true
593
+ },
594
+ {
595
+ "file": "completions",
596
+ "serial": false,
597
+ "suite": [
598
+ "mention parsing"
599
+ ],
600
+ "title": "ignores an `@` that is not preceded by whitespace",
601
+ "ok": true
602
+ },
603
+ {
604
+ "file": "completions",
605
+ "serial": false,
606
+ "suite": [
607
+ "mention parsing"
608
+ ],
609
+ "title": "ignores a cursor that is past the end of the mention",
610
+ "ok": true
611
+ },
612
+ {
613
+ "file": "completions",
614
+ "serial": false,
615
+ "suite": [
616
+ "mention parsing"
617
+ ],
618
+ "title": "returns the empty query for a lone trigger",
619
+ "ok": true
620
+ },
621
+ {
622
+ "file": "completions",
623
+ "serial": false,
624
+ "suite": [
625
+ "completions"
626
+ ],
627
+ "title": "offers files matching the typed prefix",
628
+ "ok": true
629
+ },
630
+ {
631
+ "file": "completions",
632
+ "serial": false,
633
+ "suite": [
634
+ "completions"
635
+ ],
636
+ "title": "attaches the resource each item refers to",
637
+ "ok": true
638
+ },
639
+ {
640
+ "file": "completions",
641
+ "serial": false,
642
+ "suite": [
643
+ "completions"
644
+ ],
645
+ "title": "marks the range the client should replace",
646
+ "ok": true
647
+ },
648
+ {
649
+ "file": "completions",
650
+ "serial": false,
651
+ "suite": [
652
+ "completions"
653
+ ],
654
+ "title": "returns nested files instead of directory navigation items",
655
+ "ok": true
656
+ },
657
+ {
658
+ "file": "completions",
659
+ "serial": false,
660
+ "suite": [
661
+ "completions"
662
+ ],
663
+ "title": "matches a typed relative-path prefix",
664
+ "ok": true
665
+ },
666
+ {
667
+ "file": "completions",
668
+ "serial": false,
669
+ "suite": [
670
+ "completions"
671
+ ],
672
+ "title": "matches a nested file by basename",
673
+ "ok": true
674
+ },
675
+ {
676
+ "file": "completions",
677
+ "serial": false,
678
+ "suite": [
679
+ "completions"
680
+ ],
681
+ "title": "keeps the temporary directory skip list narrow",
682
+ "ok": true
683
+ },
684
+ {
685
+ "file": "completions",
686
+ "serial": false,
687
+ "suite": [
688
+ "completions"
689
+ ],
690
+ "title": "does not interpret a query as path traversal",
691
+ "ok": true
692
+ },
693
+ {
694
+ "file": "completions",
695
+ "serial": false,
696
+ "suite": [
697
+ "completions"
698
+ ],
699
+ "title": "returns nothing for a completion kind it does not implement",
700
+ "ok": true
701
+ },
702
+ {
703
+ "file": "completions",
704
+ "serial": false,
705
+ "suite": [
706
+ "completions"
707
+ ],
708
+ "title": "returns nothing when the cursor is not in a mention",
709
+ "ok": true
710
+ },
711
+ {
712
+ "file": "completions",
713
+ "serial": false,
714
+ "suite": [
715
+ "completions"
716
+ ],
717
+ "title": "returns nothing for a chat it has no directory for",
718
+ "ok": true
719
+ },
720
+ {
721
+ "file": "completions",
722
+ "serial": false,
723
+ "suite": [
724
+ "completions"
725
+ ],
726
+ "title": "caps how many items it returns",
727
+ "ok": true
728
+ },
729
+ {
730
+ "file": "completions",
731
+ "serial": false,
732
+ "suite": [
733
+ "completions over the wire"
734
+ ],
735
+ "title": "advertises only the trigger it can answer",
736
+ "ok": true
737
+ },
738
+ {
739
+ "file": "completions",
740
+ "serial": false,
741
+ "suite": [
742
+ "completions over the wire"
743
+ ],
744
+ "title": "serves a schema-conforming result",
745
+ "ok": true
746
+ },
747
+ {
748
+ "file": "completions",
749
+ "serial": false,
750
+ "suite": [
751
+ "completions over the wire"
752
+ ],
753
+ "title": "rejects non-chat completion targets",
754
+ "ok": true
755
+ },
756
+ {
757
+ "file": "completions",
758
+ "serial": false,
759
+ "suite": [
760
+ "completions over the wire"
761
+ ],
762
+ "title": "maps provider-alias completion targets onto the default chat",
763
+ "ok": true
764
+ },
765
+ {
766
+ "file": "completions",
767
+ "serial": false,
768
+ "suite": [
769
+ "completions without a handler"
770
+ ],
771
+ "title": "answers with an empty list rather than MethodNotFound",
772
+ "ok": true
773
+ },
774
+ {
775
+ "file": "delete-session",
776
+ "serial": false,
777
+ "suite": [
778
+ "session file deletion"
779
+ ],
780
+ "title": "treats an already-missing file as success",
781
+ "ok": true
782
+ },
783
+ {
784
+ "file": "delete-session",
785
+ "serial": false,
786
+ "suite": [
787
+ "session file deletion"
788
+ ],
789
+ "title": "prefers trash and guards a path that looks like an option",
790
+ "ok": true
791
+ },
792
+ {
793
+ "file": "delete-session",
794
+ "serial": false,
795
+ "suite": [
796
+ "session file deletion"
797
+ ],
798
+ "title": "falls back to unlink when trash exits successfully but leaves the file",
799
+ "ok": true
800
+ },
801
+ {
802
+ "file": "delete-session",
803
+ "serial": false,
804
+ "suite": [
805
+ "session file deletion"
806
+ ],
807
+ "title": "recognizes trash success even when the command exits nonzero",
808
+ "ok": true
809
+ },
810
+ {
811
+ "file": "delete-session",
812
+ "serial": false,
813
+ "suite": [
814
+ "session file deletion"
815
+ ],
816
+ "title": "falls back to unlink when trash is unavailable or fails",
817
+ "ok": true
818
+ },
819
+ {
820
+ "file": "delete-session",
821
+ "serial": false,
822
+ "suite": [
823
+ "session file deletion"
824
+ ],
825
+ "title": "returns an unlink error instead of claiming deletion",
826
+ "ok": true
827
+ },
828
+ {
829
+ "file": "direct-settings",
830
+ "serial": false,
831
+ "suite": [
832
+ "direct listener settings"
833
+ ],
834
+ "title": "creates a private, reusable endpoint configuration on first use",
835
+ "ok": true
836
+ },
837
+ {
838
+ "file": "direct-settings",
839
+ "serial": false,
840
+ "suite": [
841
+ "direct listener settings"
842
+ ],
843
+ "title": "takes an existing file literally and defaults only optional fields",
844
+ "ok": true
845
+ },
846
+ {
847
+ "file": "direct-settings",
848
+ "serial": false,
849
+ "suite": [
850
+ "direct listener settings"
851
+ ],
852
+ "title": "rejects malformed or incomplete files instead of inventing replacements",
853
+ "ok": true
854
+ },
855
+ {
856
+ "file": "event-mapper",
857
+ "serial": false,
858
+ "suite": [
859
+ "event mapper \u2014 turn boundary"
860
+ ],
861
+ "title": "spans several agent runs in a single turn",
862
+ "ok": true
863
+ },
864
+ {
865
+ "file": "event-mapper",
866
+ "serial": false,
867
+ "suite": [
868
+ "event mapper \u2014 turn boundary"
869
+ ],
870
+ "title": "only closes the turn on agent_settled",
871
+ "ok": true
872
+ },
873
+ {
874
+ "file": "event-mapper",
875
+ "serial": false,
876
+ "suite": [
877
+ "event mapper \u2014 turn boundary"
878
+ ],
879
+ "title": "reports an aborted run as cancelled, not complete",
880
+ "ok": true
881
+ },
882
+ {
883
+ "file": "event-mapper",
884
+ "serial": false,
885
+ "suite": [
886
+ "event mapper \u2014 turn boundary"
887
+ ],
888
+ "title": "reports a failed run as an error and marks the chat",
889
+ "ok": true
890
+ },
891
+ {
892
+ "file": "event-mapper",
893
+ "serial": false,
894
+ "suite": [
895
+ "event mapper \u2014 turn boundary"
896
+ ],
897
+ "title": "ignores events after the turn has closed",
898
+ "ok": true
899
+ },
900
+ {
901
+ "file": "event-mapper",
902
+ "serial": false,
903
+ "suite": [
904
+ "event mapper \u2014 turn boundary"
905
+ ],
906
+ "title": "can be closed without agent_settled",
907
+ "ok": true
908
+ },
909
+ {
910
+ "file": "event-mapper",
911
+ "serial": false,
912
+ "suite": [
913
+ "event mapper \u2014 part identity"
914
+ ],
915
+ "title": "keeps contentIndex collisions across messages apart",
916
+ "ok": true
917
+ },
918
+ {
919
+ "file": "event-mapper",
920
+ "serial": false,
921
+ "suite": [
922
+ "event mapper \u2014 part identity"
923
+ ],
924
+ "title": "appends consecutive deltas into one part",
925
+ "ok": true
926
+ },
927
+ {
928
+ "file": "event-mapper",
929
+ "serial": false,
930
+ "suite": [
931
+ "event mapper \u2014 part identity"
932
+ ],
933
+ "title": "routes thinking into a reasoning part, separate from markdown",
934
+ "ok": true
935
+ },
936
+ {
937
+ "file": "event-mapper",
938
+ "serial": false,
939
+ "suite": [
940
+ "event mapper \u2014 part identity"
941
+ ],
942
+ "title": "creates parts in arrival order so interleaving survives",
943
+ "ok": true
944
+ },
945
+ {
946
+ "file": "event-mapper",
947
+ "serial": false,
948
+ "suite": [
949
+ "event mapper \u2014 part identity"
950
+ ],
951
+ "title": "recovers a block a provider never streamed",
952
+ "ok": true
953
+ },
954
+ {
955
+ "file": "event-mapper",
956
+ "serial": false,
957
+ "suite": [
958
+ "event mapper \u2014 part identity"
959
+ ],
960
+ "title": "does not duplicate a block that was streamed",
961
+ "ok": true
962
+ },
963
+ {
964
+ "file": "event-mapper",
965
+ "serial": false,
966
+ "suite": [
967
+ "event mapper \u2014 part identity"
968
+ ],
969
+ "title": "emits no part for an empty delta",
970
+ "ok": true
971
+ },
972
+ {
973
+ "file": "event-mapper",
974
+ "serial": false,
975
+ "suite": [
976
+ "event mapper \u2014 tool calls"
977
+ ],
978
+ "title": "drives a tool call from streaming to completed without confirmation",
979
+ "ok": true
980
+ },
981
+ {
982
+ "file": "event-mapper",
983
+ "serial": false,
984
+ "suite": [
985
+ "event mapper \u2014 tool calls"
986
+ ],
987
+ "title": "publishes partial output while a tool is still running",
988
+ "ok": true
989
+ },
990
+ {
991
+ "file": "event-mapper",
992
+ "serial": false,
993
+ "suite": [
994
+ "event mapper \u2014 tool calls"
995
+ ],
996
+ "title": "never enters pending-confirmation",
997
+ "ok": true
998
+ },
999
+ {
1000
+ "file": "event-mapper",
1001
+ "serial": false,
1002
+ "suite": [
1003
+ "event mapper \u2014 tool calls"
1004
+ ],
1005
+ "title": "marks a failed tool call as unsuccessful",
1006
+ "ok": true
1007
+ },
1008
+ {
1009
+ "file": "event-mapper",
1010
+ "serial": false,
1011
+ "suite": [
1012
+ "event mapper \u2014 tool calls"
1013
+ ],
1014
+ "title": "force-cancels a tool call still running when the turn ends",
1015
+ "ok": true
1016
+ },
1017
+ {
1018
+ "file": "event-mapper",
1019
+ "serial": false,
1020
+ "suite": [
1021
+ "event mapper \u2014 tool calls"
1022
+ ],
1023
+ "title": "ignores tool events for a call it never saw",
1024
+ "ok": true
1025
+ },
1026
+ {
1027
+ "file": "event-mapper",
1028
+ "serial": false,
1029
+ "suite": [
1030
+ "event mapper \u2014 usage and schema"
1031
+ ],
1032
+ "title": "carries token usage onto the turn",
1033
+ "ok": true
1034
+ },
1035
+ {
1036
+ "file": "event-mapper",
1037
+ "serial": false,
1038
+ "suite": [
1039
+ "event mapper \u2014 usage and schema"
1040
+ ],
1041
+ "title": "keeps the usage fields the protocol has no slot for",
1042
+ "ok": true
1043
+ },
1044
+ {
1045
+ "file": "event-mapper",
1046
+ "serial": false,
1047
+ "suite": [
1048
+ "event mapper \u2014 usage and schema"
1049
+ ],
1050
+ "title": "emits only schema-conforming actions",
1051
+ "ok": true
1052
+ },
1053
+ {
1054
+ "file": "event-mapper",
1055
+ "serial": false,
1056
+ "suite": [
1057
+ "event mapper \u2014 outcome from stopReason"
1058
+ ],
1059
+ "title": "treats an aborted assistant message as a cancelled turn",
1060
+ "ok": true
1061
+ },
1062
+ {
1063
+ "file": "event-mapper",
1064
+ "serial": false,
1065
+ "suite": [
1066
+ "event mapper \u2014 outcome from stopReason"
1067
+ ],
1068
+ "title": "treats a failed assistant message as an error turn",
1069
+ "ok": true
1070
+ },
1071
+ {
1072
+ "file": "event-mapper",
1073
+ "serial": false,
1074
+ "suite": [
1075
+ "event mapper \u2014 injected messages"
1076
+ ],
1077
+ "title": "gives an injected user message its own turn",
1078
+ "ok": true
1079
+ },
1080
+ {
1081
+ "file": "event-mapper",
1082
+ "serial": false,
1083
+ "suite": [
1084
+ "event mapper \u2014 injected messages"
1085
+ ],
1086
+ "title": "does not split on the run's own opening prompt",
1087
+ "ok": true
1088
+ },
1089
+ {
1090
+ "file": "event-mapper",
1091
+ "serial": false,
1092
+ "suite": [
1093
+ "event mapper \u2014 injected messages"
1094
+ ],
1095
+ "title": "keeps part ids unique across a split",
1096
+ "ok": true
1097
+ },
1098
+ {
1099
+ "file": "fetch-turns",
1100
+ "serial": false,
1101
+ "suite": [
1102
+ "fetchTurns"
1103
+ ],
1104
+ "title": "pages backward while preserving a complete oldest-first transcript",
1105
+ "ok": true
1106
+ },
1107
+ {
1108
+ "file": "fetch-turns",
1109
+ "serial": false,
1110
+ "suite": [
1111
+ "fetchTurns"
1112
+ ],
1113
+ "title": "rejects a session channel for this chat-scoped command",
1114
+ "ok": true
1115
+ },
1116
+ {
1117
+ "file": "fetch-turns",
1118
+ "serial": false,
1119
+ "suite": [
1120
+ "fetchTurns"
1121
+ ],
1122
+ "title": "rejects a cursor it did not issue",
1123
+ "ok": true
1124
+ },
1125
+ {
1126
+ "file": "fetch-turns",
1127
+ "serial": false,
1128
+ "suite": [
1129
+ "fetchTurns \u2014 nothing older"
1130
+ ],
1131
+ "title": "offers no cursor for a session that was never compacted",
1132
+ "ok": true
1133
+ },
1134
+ {
1135
+ "file": "handshake",
1136
+ "serial": false,
1137
+ "suite": [
1138
+ "handshake"
1139
+ ],
1140
+ "title": "negotiates the client's most-preferred supported version",
1141
+ "ok": true
1142
+ },
1143
+ {
1144
+ "file": "handshake",
1145
+ "serial": false,
1146
+ "suite": [
1147
+ "handshake"
1148
+ ],
1149
+ "title": "does not advertise deferred host capabilities",
1150
+ "ok": true
1151
+ },
1152
+ {
1153
+ "file": "handshake",
1154
+ "serial": false,
1155
+ "suite": [
1156
+ "handshake"
1157
+ ],
1158
+ "title": "ignores versions it does not know before the current one",
1159
+ "ok": true
1160
+ },
1161
+ {
1162
+ "file": "handshake",
1163
+ "serial": false,
1164
+ "suite": [
1165
+ "handshake"
1166
+ ],
1167
+ "title": "rejects an older wire model with UnsupportedProtocolVersion",
1168
+ "ok": true
1169
+ },
1170
+ {
1171
+ "file": "handshake",
1172
+ "serial": false,
1173
+ "suite": [
1174
+ "handshake"
1175
+ ],
1176
+ "title": "returns a snapshot for each initialSubscription in the same round-trip",
1177
+ "ok": true
1178
+ },
1179
+ {
1180
+ "file": "handshake",
1181
+ "serial": false,
1182
+ "suite": [
1183
+ "handshake"
1184
+ ],
1185
+ "title": "skips unknown initialSubscriptions instead of failing the handshake",
1186
+ "ok": true
1187
+ },
1188
+ {
1189
+ "file": "handshake",
1190
+ "serial": false,
1191
+ "suite": [
1192
+ "handshake"
1193
+ ],
1194
+ "title": "rejects an initialize without a clientId",
1195
+ "ok": true
1196
+ },
1197
+ {
1198
+ "file": "handshake",
1199
+ "serial": false,
1200
+ "suite": [
1201
+ "handshake"
1202
+ ],
1203
+ "title": "rejects malformed initialize descriptors",
1204
+ "ok": true
1205
+ },
1206
+ {
1207
+ "file": "handshake",
1208
+ "serial": false,
1209
+ "suite": [
1210
+ "handshake"
1211
+ ],
1212
+ "title": "answers ping before initialize",
1213
+ "ok": true
1214
+ },
1215
+ {
1216
+ "file": "handshake",
1217
+ "serial": false,
1218
+ "suite": [
1219
+ "handshake"
1220
+ ],
1221
+ "title": "ignores notifications before initialize or reconnect",
1222
+ "ok": true
1223
+ },
1224
+ {
1225
+ "file": "handshake",
1226
+ "serial": false,
1227
+ "suite": [
1228
+ "handshake"
1229
+ ],
1230
+ "title": "requires initialize or reconnect before other requests",
1231
+ "ok": true
1232
+ },
1233
+ {
1234
+ "file": "handshake",
1235
+ "serial": false,
1236
+ "suite": [
1237
+ "handshake"
1238
+ ],
1239
+ "title": "rejects a second handshake without changing client compatibility mode",
1240
+ "ok": true
1241
+ },
1242
+ {
1243
+ "file": "handshake",
1244
+ "serial": false,
1245
+ "suite": [
1246
+ "handshake"
1247
+ ],
1248
+ "title": "rejects malformed reconnect state without binding the connection",
1249
+ "ok": true
1250
+ },
1251
+ {
1252
+ "file": "handshake",
1253
+ "serial": false,
1254
+ "suite": [
1255
+ "handshake"
1256
+ ],
1257
+ "title": "rejects malformed subscription lists without binding or poisoning the connection",
1258
+ "ok": true
1259
+ },
1260
+ {
1261
+ "file": "handshake",
1262
+ "serial": false,
1263
+ "suite": [
1264
+ "connection token"
1265
+ ],
1266
+ "title": "accepts the token as `token`",
1267
+ "ok": true
1268
+ },
1269
+ {
1270
+ "file": "handshake",
1271
+ "serial": false,
1272
+ "suite": [
1273
+ "connection token"
1274
+ ],
1275
+ "title": "accepts the token as `tkn`",
1276
+ "ok": true
1277
+ },
1278
+ {
1279
+ "file": "handshake",
1280
+ "serial": false,
1281
+ "suite": [
1282
+ "connection token"
1283
+ ],
1284
+ "title": "rejects a wrong token",
1285
+ "ok": true
1286
+ },
1287
+ {
1288
+ "file": "handshake",
1289
+ "serial": false,
1290
+ "suite": [
1291
+ "connection token"
1292
+ ],
1293
+ "title": "ignores a VS Code tkn when the listener requires no token",
1294
+ "ok": true
1295
+ },
1296
+ {
1297
+ "file": "hydrated-session-lifecycle",
1298
+ "serial": false,
1299
+ "suite": [
1300
+ "read state after hydration"
1301
+ ],
1302
+ "title": "reports every catalogue entry as read",
1303
+ "ok": true
1304
+ },
1305
+ {
1306
+ "file": "hydrated-session-lifecycle",
1307
+ "serial": false,
1308
+ "suite": [
1309
+ "read state after hydration"
1310
+ ],
1311
+ "title": "reports a hydrated session as read",
1312
+ "ok": true
1313
+ },
1314
+ {
1315
+ "file": "hydrated-session-lifecycle",
1316
+ "serial": false,
1317
+ "suite": [
1318
+ "read state after hydration"
1319
+ ],
1320
+ "title": "keeps session-owned read state when a starting turn marks the chat unread",
1321
+ "ok": true
1322
+ },
1323
+ {
1324
+ "file": "hydrated-session-lifecycle",
1325
+ "serial": false,
1326
+ "suite": [
1327
+ "disposing a hydrated session"
1328
+ ],
1329
+ "title": "removes it from the catalogue and deletes the file",
1330
+ "ok": true
1331
+ },
1332
+ {
1333
+ "file": "hydrated-session-lifecycle",
1334
+ "serial": false,
1335
+ "suite": [
1336
+ "disposing a hydrated session"
1337
+ ],
1338
+ "title": "prevents an unloaded session from being recreated or hydrated during deletion",
1339
+ "ok": true
1340
+ },
1341
+ {
1342
+ "file": "hydrated-session-lifecycle",
1343
+ "serial": false,
1344
+ "suite": [
1345
+ "resuming a hydrated session"
1346
+ ],
1347
+ "title": "starts an agent on the first turn and prompts it",
1348
+ "ok": true
1349
+ },
1350
+ {
1351
+ "file": "hydrated-session-lifecycle",
1352
+ "serial": false,
1353
+ "suite": [
1354
+ "resuming a hydrated session"
1355
+ ],
1356
+ "title": "resumes onto the existing transcript rather than a fresh one",
1357
+ "ok": true
1358
+ },
1359
+ {
1360
+ "file": "hydrated-session-lifecycle",
1361
+ "serial": false,
1362
+ "suite": [
1363
+ "model selection on a hydrated session"
1364
+ ],
1365
+ "title": "seeds the picker from the model the session was using",
1366
+ "ok": true
1367
+ },
1368
+ {
1369
+ "file": "hydrated-session-lifecycle",
1370
+ "serial": false,
1371
+ "suite": [
1372
+ "renaming a hydrated session"
1373
+ ],
1374
+ "title": "persists the name into the session file",
1375
+ "ok": true
1376
+ },
1377
+ {
1378
+ "file": "image-input",
1379
+ "serial": false,
1380
+ "suite": [
1381
+ "pi image input"
1382
+ ],
1383
+ "title": "converts an unsupported image type even when auto-resize is disabled",
1384
+ "ok": true
1385
+ },
1386
+ {
1387
+ "file": "image-input",
1388
+ "serial": false,
1389
+ "suite": [
1390
+ "pi image input"
1391
+ ],
1392
+ "title": "fails when image bytes cannot be prepared",
1393
+ "ok": true
1394
+ },
1395
+ {
1396
+ "file": "image-session",
1397
+ "serial": false,
1398
+ "suite": [],
1399
+ "title": "passes and persists images while honouring preflight cancellation",
1400
+ "ok": true
1401
+ },
1402
+ {
1403
+ "file": "live-turn",
1404
+ "serial": false,
1405
+ "suite": [],
1406
+ "title": "live turn # SKIP needs a real model \u2014 set PI_AHP_LIVE_SETTINGS and PI_AHP_LIVE_AUTH",
1407
+ "ok": true
1408
+ },
1409
+ {
1410
+ "file": "mapper-fixtures",
1411
+ "serial": false,
1412
+ "suite": [
1413
+ "recorded stream replay \u2014 invariants"
1414
+ ],
1415
+ "title": "plain-text \u2014 A reply with no tool calls \u2014 the simplest possible turn.",
1416
+ "ok": true
1417
+ },
1418
+ {
1419
+ "file": "mapper-fixtures",
1420
+ "serial": false,
1421
+ "suite": [
1422
+ "recorded stream replay \u2014 invariants"
1423
+ ],
1424
+ "title": "single-tool \u2014 One tool call, then an answer derived from its result.",
1425
+ "ok": true
1426
+ },
1427
+ {
1428
+ "file": "mapper-fixtures",
1429
+ "serial": false,
1430
+ "suite": [
1431
+ "recorded stream replay \u2014 invariants"
1432
+ ],
1433
+ "title": "parallel-tools \u2014 Several tool calls in one assistant message \u2014 exercises contentIndex fan-out.",
1434
+ "ok": true
1435
+ },
1436
+ {
1437
+ "file": "mapper-fixtures",
1438
+ "serial": false,
1439
+ "suite": [
1440
+ "recorded stream replay \u2014 invariants"
1441
+ ],
1442
+ "title": "tool-loop \u2014 Two or more assistant messages in one turn \u2014 the case where contentIndex restarts and partIds must not collide.",
1443
+ "ok": true
1444
+ },
1445
+ {
1446
+ "file": "mapper-fixtures",
1447
+ "serial": false,
1448
+ "suite": [
1449
+ "recorded stream replay \u2014 invariants"
1450
+ ],
1451
+ "title": "tool-error \u2014 A failing tool call the agent has to recover from.",
1452
+ "ok": true
1453
+ },
1454
+ {
1455
+ "file": "mapper-fixtures",
1456
+ "serial": false,
1457
+ "suite": [
1458
+ "recorded stream replay \u2014 invariants"
1459
+ ],
1460
+ "title": "abort \u2014 A turn cancelled while it is running.",
1461
+ "ok": true
1462
+ },
1463
+ {
1464
+ "file": "mapper-fixtures",
1465
+ "serial": false,
1466
+ "suite": [
1467
+ "recorded stream replay \u2014 invariants"
1468
+ ],
1469
+ "title": "steering \u2014 A steering message injected into a running turn.",
1470
+ "ok": true
1471
+ },
1472
+ {
1473
+ "file": "mapper-fixtures",
1474
+ "serial": false,
1475
+ "suite": [
1476
+ "recorded stream replay \u2014 invariants"
1477
+ ],
1478
+ "title": "tool-edit \u2014 An `edit` call \u2014 the one tool whose result carries a diff and a patch.",
1479
+ "ok": true
1480
+ },
1481
+ {
1482
+ "file": "mapper-fixtures",
1483
+ "serial": false,
1484
+ "suite": [
1485
+ "recorded stream replay \u2014 invariants"
1486
+ ],
1487
+ "title": "tool-write \u2014 A `write` call \u2014 a whole new file rather than an edit to one.",
1488
+ "ok": true
1489
+ },
1490
+ {
1491
+ "file": "mapper-fixtures",
1492
+ "serial": false,
1493
+ "suite": [
1494
+ "recorded stream replay \u2014 invariants"
1495
+ ],
1496
+ "title": "tool-bash \u2014 A `bash` call \u2014 stdout, exit status, and pi's truncation metadata.",
1497
+ "ok": true
1498
+ },
1499
+ {
1500
+ "file": "mapper-fixtures",
1501
+ "serial": false,
1502
+ "suite": [
1503
+ "recorded stream replay \u2014 invariants"
1504
+ ],
1505
+ "title": "tool-ls \u2014 An `ls` call \u2014 a directory listing, which reports its own entry limit.",
1506
+ "ok": true
1507
+ },
1508
+ {
1509
+ "file": "mapper-fixtures",
1510
+ "serial": false,
1511
+ "suite": [
1512
+ "recorded stream replay \u2014 invariants"
1513
+ ],
1514
+ "title": "tool-grep \u2014 A `grep` call \u2014 match counts and line truncation live in its details.",
1515
+ "ok": true
1516
+ },
1517
+ {
1518
+ "file": "mapper-fixtures",
1519
+ "serial": false,
1520
+ "suite": [
1521
+ "recorded stream replay \u2014 invariants"
1522
+ ],
1523
+ "title": "tool-find \u2014 A `find` call \u2014 path globbing, with its own result limit.",
1524
+ "ok": true
1525
+ },
1526
+ {
1527
+ "file": "mapper-fixtures",
1528
+ "serial": false,
1529
+ "suite": [
1530
+ "recorded stream replay \u2014 invariants"
1531
+ ],
1532
+ "title": "compaction \u2014 A manual compaction \u2014 `buildContextEntries` starts from the newest one, so this is the boundary history rebuilding and turn paging are built around.",
1533
+ "ok": true
1534
+ },
1535
+ {
1536
+ "file": "mapper-fixtures",
1537
+ "serial": false,
1538
+ "suite": [
1539
+ "recorded stream replay \u2014 invariants"
1540
+ ],
1541
+ "title": "bash-long-output \u2014 A bash call whose output is large enough for pi to stream updates and report truncation.",
1542
+ "ok": true
1543
+ },
1544
+ {
1545
+ "file": "mapper-fixtures",
1546
+ "serial": false,
1547
+ "suite": [
1548
+ "recorded stream replay \u2014 per scenario"
1549
+ ],
1550
+ "title": "plain-text: answers with no tool calls",
1551
+ "ok": true
1552
+ },
1553
+ {
1554
+ "file": "mapper-fixtures",
1555
+ "serial": false,
1556
+ "suite": [
1557
+ "recorded stream replay \u2014 per scenario"
1558
+ ],
1559
+ "title": "describes a tool call in terms a user can act on",
1560
+ "ok": true
1561
+ },
1562
+ {
1563
+ "file": "mapper-fixtures",
1564
+ "serial": false,
1565
+ "suite": [
1566
+ "recorded stream replay \u2014 per scenario"
1567
+ ],
1568
+ "title": "shows a tool's subject rather than its arguments as JSON",
1569
+ "ok": true
1570
+ },
1571
+ {
1572
+ "file": "mapper-fixtures",
1573
+ "serial": false,
1574
+ "suite": [
1575
+ "recorded stream replay \u2014 per scenario"
1576
+ ],
1577
+ "title": "tool-edit: hands the client the patch, not a count of edited blocks",
1578
+ "ok": true
1579
+ },
1580
+ {
1581
+ "file": "mapper-fixtures",
1582
+ "serial": false,
1583
+ "suite": [
1584
+ "recorded stream replay \u2014 per scenario"
1585
+ ],
1586
+ "title": "single-tool: runs one tool and answers from its result",
1587
+ "ok": true
1588
+ },
1589
+ {
1590
+ "file": "mapper-fixtures",
1591
+ "serial": false,
1592
+ "suite": [
1593
+ "recorded stream replay \u2014 per scenario"
1594
+ ],
1595
+ "title": "parallel-tools: keeps several tool calls in one message distinct",
1596
+ "ok": true
1597
+ },
1598
+ {
1599
+ "file": "mapper-fixtures",
1600
+ "serial": false,
1601
+ "suite": [
1602
+ "recorded stream replay \u2014 per scenario"
1603
+ ],
1604
+ "title": "tool-loop: spans several assistant messages without part collisions",
1605
+ "ok": true
1606
+ },
1607
+ {
1608
+ "file": "mapper-fixtures",
1609
+ "serial": false,
1610
+ "suite": [
1611
+ "recorded stream replay \u2014 per scenario"
1612
+ ],
1613
+ "title": "tool-error: surfaces a failed tool without failing the turn",
1614
+ "ok": true
1615
+ },
1616
+ {
1617
+ "file": "mapper-fixtures",
1618
+ "serial": false,
1619
+ "suite": [
1620
+ "recorded stream replay \u2014 per scenario"
1621
+ ],
1622
+ "title": "abort: ends the turn as cancelled",
1623
+ "ok": true
1624
+ },
1625
+ {
1626
+ "file": "mapper-fixtures",
1627
+ "serial": false,
1628
+ "suite": [
1629
+ "recorded stream replay \u2014 per scenario"
1630
+ ],
1631
+ "title": "steering: the injected message becomes its own turn",
1632
+ "ok": true
1633
+ },
1634
+ {
1635
+ "file": "message-input",
1636
+ "serial": false,
1637
+ "suite": [
1638
+ "pi message input"
1639
+ ],
1640
+ "title": "appends a file resource as a path with its selection",
1641
+ "ok": true
1642
+ },
1643
+ {
1644
+ "file": "message-input",
1645
+ "serial": false,
1646
+ "suite": [
1647
+ "pi message input"
1648
+ ],
1649
+ "title": "appends attachment representations in order",
1650
+ "ok": true
1651
+ },
1652
+ {
1653
+ "file": "message-input",
1654
+ "serial": false,
1655
+ "suite": [
1656
+ "pi message input"
1657
+ ],
1658
+ "title": "preserves resource URIs whose schemes may carry their own routing",
1659
+ "ok": true
1660
+ },
1661
+ {
1662
+ "file": "message-input",
1663
+ "serial": false,
1664
+ "suite": [
1665
+ "pi message input"
1666
+ ],
1667
+ "title": "preserves a VS Code-wrapped resource without guessing which host owns it",
1668
+ "ok": true
1669
+ },
1670
+ {
1671
+ "file": "message-input",
1672
+ "serial": false,
1673
+ "suite": [
1674
+ "pi message input"
1675
+ ],
1676
+ "title": "requires client-created simple attachments to carry a model representation",
1677
+ "ok": true
1678
+ },
1679
+ {
1680
+ "file": "message-input",
1681
+ "serial": false,
1682
+ "suite": [
1683
+ "pi message input"
1684
+ ],
1685
+ "title": "separates embedded images from the text prompt",
1686
+ "ok": true
1687
+ },
1688
+ {
1689
+ "file": "message-input",
1690
+ "serial": false,
1691
+ "suite": [
1692
+ "pi message input"
1693
+ ],
1694
+ "title": "rejects an empty embedded image",
1695
+ "ok": true
1696
+ },
1697
+ {
1698
+ "file": "message-input",
1699
+ "serial": false,
1700
+ "suite": [
1701
+ "pi message input"
1702
+ ],
1703
+ "title": "appends UTF-8 embedded text without interpreting its MIME type",
1704
+ "ok": true
1705
+ },
1706
+ {
1707
+ "file": "message-input",
1708
+ "serial": false,
1709
+ "suite": [
1710
+ "pi message input"
1711
+ ],
1712
+ "title": "keeps embedded payload under its original 1-based selection marker",
1713
+ "ok": true
1714
+ },
1715
+ {
1716
+ "file": "message-input",
1717
+ "serial": false,
1718
+ "suite": [
1719
+ "pi message input"
1720
+ ],
1721
+ "title": "rejects malformed or non-text embedded payloads",
1722
+ "ok": true
1723
+ },
1724
+ {
1725
+ "file": "message-input",
1726
+ "serial": false,
1727
+ "suite": [
1728
+ "pi message input"
1729
+ ],
1730
+ "title": "rejects malformed message and selection shapes without throwing",
1731
+ "ok": true
1732
+ },
1733
+ {
1734
+ "file": "message-input",
1735
+ "serial": false,
1736
+ "suite": [
1737
+ "pi message input"
1738
+ ],
1739
+ "title": "rejects annotations and chat attachments",
1740
+ "ok": true
1741
+ },
1742
+ {
1743
+ "file": "model-discovery",
1744
+ "serial": false,
1745
+ "suite": [],
1746
+ "title": "advertises extension models and uses pi's configured default",
1747
+ "ok": true
1748
+ },
1749
+ {
1750
+ "file": "model-discovery",
1751
+ "serial": false,
1752
+ "suite": [],
1753
+ "title": "resolves stale and provider-qualified model selections safely",
1754
+ "ok": true
1755
+ },
1756
+ {
1757
+ "file": "models",
1758
+ "serial": false,
1759
+ "suite": [
1760
+ "model mapping"
1761
+ ],
1762
+ "title": "offers the standard thinking levels when no extended levels are declared",
1763
+ "ok": true
1764
+ },
1765
+ {
1766
+ "file": "models",
1767
+ "serial": false,
1768
+ "suite": [
1769
+ "model mapping"
1770
+ ],
1771
+ "title": "offers only `off` for a model without reasoning",
1772
+ "ok": true
1773
+ },
1774
+ {
1775
+ "file": "models",
1776
+ "serial": false,
1777
+ "suite": [
1778
+ "model mapping"
1779
+ ],
1780
+ "title": "drops unsupported levels and opts into extended levels exactly as pi does",
1781
+ "ok": true
1782
+ },
1783
+ {
1784
+ "file": "models",
1785
+ "serial": false,
1786
+ "suite": [
1787
+ "model mapping"
1788
+ ],
1789
+ "title": "uses pi's provider-qualified model ids on the wire",
1790
+ "ok": true
1791
+ },
1792
+ {
1793
+ "file": "models",
1794
+ "serial": false,
1795
+ "suite": [
1796
+ "model mapping"
1797
+ ],
1798
+ "title": "resolves qualified ids without confusing providers",
1799
+ "ok": true
1800
+ },
1801
+ {
1802
+ "file": "models",
1803
+ "serial": false,
1804
+ "suite": [
1805
+ "model mapping"
1806
+ ],
1807
+ "title": "accepts an unambiguous legacy bare model id",
1808
+ "ok": true
1809
+ },
1810
+ {
1811
+ "file": "models",
1812
+ "serial": false,
1813
+ "suite": [
1814
+ "model mapping"
1815
+ ],
1816
+ "title": "exposes thinking level as a model configSchema",
1817
+ "ok": true
1818
+ },
1819
+ {
1820
+ "file": "models",
1821
+ "serial": false,
1822
+ "suite": [
1823
+ "model mapping"
1824
+ ],
1825
+ "title": "maps pi input modalities onto the vision capability",
1826
+ "ok": true
1827
+ },
1828
+ {
1829
+ "file": "models",
1830
+ "serial": false,
1831
+ "suite": [
1832
+ "model mapping"
1833
+ ],
1834
+ "title": "omits the configSchema when there is nothing to choose",
1835
+ "ok": true
1836
+ },
1837
+ {
1838
+ "file": "models",
1839
+ "serial": false,
1840
+ "suite": [
1841
+ "model mapping"
1842
+ ],
1843
+ "title": "produces a schema-conforming AgentInfo",
1844
+ "ok": true
1845
+ },
1846
+ {
1847
+ "file": "pi-host",
1848
+ "serial": false,
1849
+ "suite": [],
1850
+ "title": "wires product services through createPiHost",
1851
+ "ok": true
1852
+ },
1853
+ {
1854
+ "file": "pi-replay",
1855
+ "serial": false,
1856
+ "suite": [
1857
+ "recorded provider streams preserve AHP-visible behavior"
1858
+ ],
1859
+ "title": "plain-text",
1860
+ "ok": true
1861
+ },
1862
+ {
1863
+ "file": "pi-replay",
1864
+ "serial": false,
1865
+ "suite": [
1866
+ "recorded provider streams preserve AHP-visible behavior"
1867
+ ],
1868
+ "title": "single-tool",
1869
+ "ok": true
1870
+ },
1871
+ {
1872
+ "file": "pi-replay",
1873
+ "serial": false,
1874
+ "suite": [
1875
+ "recorded provider streams preserve AHP-visible behavior"
1876
+ ],
1877
+ "title": "parallel-tools",
1878
+ "ok": true
1879
+ },
1880
+ {
1881
+ "file": "pi-replay",
1882
+ "serial": false,
1883
+ "suite": [
1884
+ "recorded provider streams preserve AHP-visible behavior"
1885
+ ],
1886
+ "title": "tool-loop",
1887
+ "ok": true
1888
+ },
1889
+ {
1890
+ "file": "pi-replay",
1891
+ "serial": false,
1892
+ "suite": [
1893
+ "recorded provider streams preserve AHP-visible behavior"
1894
+ ],
1895
+ "title": "tool-error",
1896
+ "ok": true
1897
+ },
1898
+ {
1899
+ "file": "pi-replay",
1900
+ "serial": false,
1901
+ "suite": [
1902
+ "recorded provider streams preserve AHP-visible behavior"
1903
+ ],
1904
+ "title": "abort",
1905
+ "ok": true
1906
+ },
1907
+ {
1908
+ "file": "pi-replay",
1909
+ "serial": false,
1910
+ "suite": [
1911
+ "recorded provider streams preserve AHP-visible behavior"
1912
+ ],
1913
+ "title": "steering",
1914
+ "ok": true
1915
+ },
1916
+ {
1917
+ "file": "pi-replay",
1918
+ "serial": false,
1919
+ "suite": [
1920
+ "recorded provider streams preserve AHP-visible behavior"
1921
+ ],
1922
+ "title": "tool-edit",
1923
+ "ok": true
1924
+ },
1925
+ {
1926
+ "file": "pi-replay",
1927
+ "serial": false,
1928
+ "suite": [
1929
+ "recorded provider streams preserve AHP-visible behavior"
1930
+ ],
1931
+ "title": "tool-write",
1932
+ "ok": true
1933
+ },
1934
+ {
1935
+ "file": "pi-replay",
1936
+ "serial": false,
1937
+ "suite": [
1938
+ "recorded provider streams preserve AHP-visible behavior"
1939
+ ],
1940
+ "title": "tool-bash",
1941
+ "ok": true
1942
+ },
1943
+ {
1944
+ "file": "pi-replay",
1945
+ "serial": false,
1946
+ "suite": [
1947
+ "recorded provider streams preserve AHP-visible behavior"
1948
+ ],
1949
+ "title": "tool-ls",
1950
+ "ok": true
1951
+ },
1952
+ {
1953
+ "file": "pi-replay",
1954
+ "serial": false,
1955
+ "suite": [
1956
+ "recorded provider streams preserve AHP-visible behavior"
1957
+ ],
1958
+ "title": "tool-grep",
1959
+ "ok": true
1960
+ },
1961
+ {
1962
+ "file": "pi-replay",
1963
+ "serial": false,
1964
+ "suite": [
1965
+ "recorded provider streams preserve AHP-visible behavior"
1966
+ ],
1967
+ "title": "tool-find",
1968
+ "ok": true
1969
+ },
1970
+ {
1971
+ "file": "pi-replay",
1972
+ "serial": false,
1973
+ "suite": [
1974
+ "recorded provider streams preserve AHP-visible behavior"
1975
+ ],
1976
+ "title": "compaction",
1977
+ "ok": true
1978
+ },
1979
+ {
1980
+ "file": "pi-replay",
1981
+ "serial": false,
1982
+ "suite": [
1983
+ "recorded provider streams preserve AHP-visible behavior"
1984
+ ],
1985
+ "title": "bash-long-output",
1986
+ "ok": true
1987
+ },
1988
+ {
1989
+ "file": "project-trust",
1990
+ "serial": false,
1991
+ "suite": [
1992
+ "project trust"
1993
+ ],
1994
+ "title": "trusts by default, matching raw pi SDK construction",
1995
+ "ok": true
1996
+ },
1997
+ {
1998
+ "file": "project-trust",
1999
+ "serial": false,
2000
+ "suite": [
2001
+ "project trust"
2002
+ ],
2003
+ "title": "trusts a directory with nothing to gate",
2004
+ "ok": true
2005
+ },
2006
+ {
2007
+ "file": "project-trust",
2008
+ "serial": false,
2009
+ "suite": [
2010
+ "project trust"
2011
+ ],
2012
+ "title": "declines a project nobody has approved, under `inherit`",
2013
+ "ok": true
2014
+ },
2015
+ {
2016
+ "file": "project-trust",
2017
+ "serial": false,
2018
+ "suite": [
2019
+ "project trust"
2020
+ ],
2021
+ "title": "inherits a decision the user made with pi's CLI",
2022
+ "ok": true
2023
+ },
2024
+ {
2025
+ "file": "project-trust",
2026
+ "serial": false,
2027
+ "suite": [
2028
+ "project trust"
2029
+ ],
2030
+ "title": "honours an explicit distrust from pi's CLI",
2031
+ "ok": true
2032
+ },
2033
+ {
2034
+ "file": "project-trust",
2035
+ "serial": false,
2036
+ "suite": [
2037
+ "project trust"
2038
+ ],
2039
+ "title": "the `never` policy overrides a stored trust decision",
2040
+ "ok": true
2041
+ },
2042
+ {
2043
+ "file": "project-trust",
2044
+ "serial": false,
2045
+ "suite": [
2046
+ "project trust"
2047
+ ],
2048
+ "title": "applies the decision before pi loads project extensions",
2049
+ "ok": true
2050
+ },
2051
+ {
2052
+ "file": "protocol-surface",
2053
+ "serial": false,
2054
+ "suite": [
2055
+ "AHP command surface"
2056
+ ],
2057
+ "title": "returns MethodNotFound for every deliberately unsupported command",
2058
+ "ok": true
2059
+ },
2060
+ {
2061
+ "file": "protocol-surface",
2062
+ "serial": false,
2063
+ "suite": [
2064
+ "AHP command surface"
2065
+ ],
2066
+ "title": "requires the root routing channel on every connection-level command",
2067
+ "ok": true
2068
+ },
2069
+ {
2070
+ "file": "pty",
2071
+ "serial": false,
2072
+ "suite": [],
2073
+ "title": "round-trips input through a resized TTY",
2074
+ "ok": true
2075
+ },
2076
+ {
2077
+ "file": "pty",
2078
+ "serial": false,
2079
+ "suite": [],
2080
+ "title": "delivers Ctrl-C to the foreground job without killing the shell",
2081
+ "ok": true
2082
+ },
2083
+ {
2084
+ "file": "reconnect",
2085
+ "serial": false,
2086
+ "suite": [
2087
+ "reconnect"
2088
+ ],
2089
+ "title": "keeps non-VS Code and explicitly misrouted reconnects strict",
2090
+ "ok": true
2091
+ },
2092
+ {
2093
+ "file": "reconnect",
2094
+ "serial": false,
2095
+ "suite": [
2096
+ "reconnect"
2097
+ ],
2098
+ "title": "replays only the actions the client missed",
2099
+ "ok": true
2100
+ },
2101
+ {
2102
+ "file": "reconnect",
2103
+ "serial": false,
2104
+ "suite": [
2105
+ "reconnect"
2106
+ ],
2107
+ "title": "falls back to snapshots when the gap predates the replay buffer",
2108
+ "ok": true
2109
+ },
2110
+ {
2111
+ "file": "reconnect",
2112
+ "serial": false,
2113
+ "suite": [
2114
+ "reconnect"
2115
+ ],
2116
+ "title": "reports subscriptions it cannot resume as missing",
2117
+ "ok": true
2118
+ },
2119
+ {
2120
+ "file": "reconnect",
2121
+ "serial": false,
2122
+ "suite": [
2123
+ "reconnect"
2124
+ ],
2125
+ "title": "returns an empty replay for a client that is already current",
2126
+ "ok": true
2127
+ },
2128
+ {
2129
+ "file": "reconnect",
2130
+ "serial": false,
2131
+ "suite": [
2132
+ "reconnect"
2133
+ ],
2134
+ "title": "replaces a half-open connection that reuses a clientId",
2135
+ "ok": true
2136
+ },
2137
+ {
2138
+ "file": "reconnect",
2139
+ "serial": false,
2140
+ "suite": [
2141
+ "reconnect"
2142
+ ],
2143
+ "title": "retains clientInfo when a replacement initialize omits it",
2144
+ "ok": true
2145
+ },
2146
+ {
2147
+ "file": "reconnect",
2148
+ "serial": false,
2149
+ "suite": [
2150
+ "reconnect"
2151
+ ],
2152
+ "title": "infers the provider URI dialect without clientInfo",
2153
+ "ok": true
2154
+ },
2155
+ {
2156
+ "file": "reconnect",
2157
+ "serial": false,
2158
+ "suite": [
2159
+ "reconnect"
2160
+ ],
2161
+ "title": "retains VS Code's URI dialect across connections",
2162
+ "ok": true
2163
+ },
2164
+ {
2165
+ "file": "reconnect",
2166
+ "serial": false,
2167
+ "suite": [
2168
+ "reconnect after host restart"
2169
+ ],
2170
+ "title": "repairs VS Code's channel-less reconnect and restores a durable session",
2171
+ "ok": true
2172
+ },
2173
+ {
2174
+ "file": "resource-watch-policy",
2175
+ "serial": false,
2176
+ "suite": [
2177
+ "watch path scope and filters"
2178
+ ],
2179
+ "title": "normalizes descendants and rejects siblings and prefix lookalikes",
2180
+ "ok": true
2181
+ },
2182
+ {
2183
+ "file": "resource-watch-policy",
2184
+ "serial": false,
2185
+ "suite": [
2186
+ "watch path scope and filters"
2187
+ ],
2188
+ "title": "keeps the watched root visible regardless of filters",
2189
+ "ok": true
2190
+ },
2191
+ {
2192
+ "file": "resource-watch-policy",
2193
+ "serial": false,
2194
+ "suite": [
2195
+ "watch path scope and filters"
2196
+ ],
2197
+ "title": "applies include alternatives and exclude precedence to every path",
2198
+ "ok": true
2199
+ },
2200
+ {
2201
+ "file": "resource-watch-policy",
2202
+ "serial": false,
2203
+ "suite": [
2204
+ "watch path scope and filters"
2205
+ ],
2206
+ "title": "does not prune a directory just because its children alone match the include filter",
2207
+ "ok": true
2208
+ },
2209
+ {
2210
+ "file": "resource-watch-policy",
2211
+ "serial": false,
2212
+ "suite": [
2213
+ "watch batch transitions"
2214
+ ],
2215
+ "title": "coalesces empty followed by each native event type",
2216
+ "ok": true
2217
+ },
2218
+ {
2219
+ "file": "resource-watch-policy",
2220
+ "serial": false,
2221
+ "suite": [
2222
+ "watch batch transitions"
2223
+ ],
2224
+ "title": "coalesces added followed by each native event type",
2225
+ "ok": true
2226
+ },
2227
+ {
2228
+ "file": "resource-watch-policy",
2229
+ "serial": false,
2230
+ "suite": [
2231
+ "watch batch transitions"
2232
+ ],
2233
+ "title": "coalesces updated followed by each native event type",
2234
+ "ok": true
2235
+ },
2236
+ {
2237
+ "file": "resource-watch-policy",
2238
+ "serial": false,
2239
+ "suite": [
2240
+ "watch batch transitions"
2241
+ ],
2242
+ "title": "coalesces deleted followed by each native event type",
2243
+ "ok": true
2244
+ },
2245
+ {
2246
+ "file": "resource-watch-policy",
2247
+ "serial": false,
2248
+ "suite": [
2249
+ "watch batch transitions"
2250
+ ],
2251
+ "title": "handles replacement and transient paths across longer sequences",
2252
+ "ok": true
2253
+ },
2254
+ {
2255
+ "file": "resource-watch",
2256
+ "serial": true,
2257
+ "suite": [
2258
+ "resource watch"
2259
+ ],
2260
+ "title": "returns a watch channel whose state describes what is watched",
2261
+ "ok": true
2262
+ },
2263
+ {
2264
+ "file": "resource-watch",
2265
+ "serial": true,
2266
+ "suite": [
2267
+ "resource watch"
2268
+ ],
2269
+ "title": "classifies newly created paths as added",
2270
+ "ok": true
2271
+ },
2272
+ {
2273
+ "file": "resource-watch",
2274
+ "serial": true,
2275
+ "suite": [
2276
+ "resource watch"
2277
+ ],
2278
+ "title": "classifies changes to existing paths as updated",
2279
+ "ok": true
2280
+ },
2281
+ {
2282
+ "file": "resource-watch",
2283
+ "serial": true,
2284
+ "suite": [
2285
+ "resource watch"
2286
+ ],
2287
+ "title": "watches a single file at its actual URI",
2288
+ "ok": true
2289
+ },
2290
+ {
2291
+ "file": "resource-watch",
2292
+ "serial": true,
2293
+ "suite": [
2294
+ "resource watch"
2295
+ ],
2296
+ "title": "reports deletion and recreation of the watched file",
2297
+ "ok": true
2298
+ },
2299
+ {
2300
+ "file": "resource-watch",
2301
+ "serial": true,
2302
+ "suite": [
2303
+ "resource watch"
2304
+ ],
2305
+ "title": "keeps a single-file watch attached across an atomic replacement",
2306
+ "ok": true
2307
+ },
2308
+ {
2309
+ "file": "resource-watch",
2310
+ "serial": true,
2311
+ "suite": [
2312
+ "resource watch"
2313
+ ],
2314
+ "title": "keeps a directory watch attached across deletion and recreation",
2315
+ "ok": true
2316
+ },
2317
+ {
2318
+ "file": "resource-watch",
2319
+ "serial": true,
2320
+ "suite": [
2321
+ "resource watch"
2322
+ ],
2323
+ "title": "reports both sides of a rename without assuming batch boundaries",
2324
+ "ok": true
2325
+ },
2326
+ {
2327
+ "file": "resource-watch",
2328
+ "serial": true,
2329
+ "suite": [
2330
+ "resource watch"
2331
+ ],
2332
+ "title": "does not lose paths from a burst",
2333
+ "ok": true
2334
+ },
2335
+ {
2336
+ "file": "resource-watch",
2337
+ "serial": true,
2338
+ "suite": [
2339
+ "resource watch"
2340
+ ],
2341
+ "title": "reports direct children with recursive=false",
2342
+ "ok": true
2343
+ },
2344
+ {
2345
+ "file": "resource-watch",
2346
+ "serial": true,
2347
+ "suite": [
2348
+ "resource watch"
2349
+ ],
2350
+ "title": "reports grandchildren with recursive=true",
2351
+ "ok": true
2352
+ },
2353
+ {
2354
+ "file": "resource-watch",
2355
+ "serial": true,
2356
+ "suite": [
2357
+ "resource watch"
2358
+ ],
2359
+ "title": "wires includes into native watch delivery",
2360
+ "ok": true
2361
+ },
2362
+ {
2363
+ "file": "resource-watch",
2364
+ "serial": true,
2365
+ "suite": [
2366
+ "resource watch"
2367
+ ],
2368
+ "title": "wires excludes into native watch delivery",
2369
+ "ok": true
2370
+ },
2371
+ {
2372
+ "file": "resource-watch",
2373
+ "serial": true,
2374
+ "suite": [
2375
+ "resource watch"
2376
+ ],
2377
+ "title": "rejects watching something that does not exist",
2378
+ "ok": true
2379
+ },
2380
+ {
2381
+ "file": "resource-watch",
2382
+ "serial": true,
2383
+ "suite": [
2384
+ "resource watch"
2385
+ ],
2386
+ "title": "rejects a recursive watch on a file",
2387
+ "ok": true
2388
+ },
2389
+ {
2390
+ "file": "resource-watch",
2391
+ "serial": true,
2392
+ "suite": [
2393
+ "resource watch"
2394
+ ],
2395
+ "title": "rejects malformed filter parameters",
2396
+ "ok": true
2397
+ },
2398
+ {
2399
+ "file": "resource-watch",
2400
+ "serial": true,
2401
+ "suite": [
2402
+ "resource watch \u2014 roots"
2403
+ ],
2404
+ "title": "maps a permitted directory symlink back to the requested URI",
2405
+ "ok": true
2406
+ },
2407
+ {
2408
+ "file": "resource-watch",
2409
+ "serial": true,
2410
+ "suite": [
2411
+ "resource watch \u2014 roots"
2412
+ ],
2413
+ "title": "uses the same root and symlink policy as resource operations",
2414
+ "ok": true
2415
+ },
2416
+ {
2417
+ "file": "resource-watch",
2418
+ "serial": true,
2419
+ "suite": [
2420
+ "resource watch \u2014 lifetime"
2421
+ ],
2422
+ "title": "waits for the last subscriber before scheduling release",
2423
+ "ok": false
2424
+ },
2425
+ {
2426
+ "file": "resource-watch",
2427
+ "serial": true,
2428
+ "suite": [
2429
+ "resource watch \u2014 lifetime"
2430
+ ],
2431
+ "title": "cancels grace on subscribe and grants a full window after the next unsubscribe",
2432
+ "ok": false
2433
+ },
2434
+ {
2435
+ "file": "resource-watch",
2436
+ "serial": true,
2437
+ "suite": [
2438
+ "resource watch \u2014 lifetime"
2439
+ ],
2440
+ "title": "cancels grace on initialize and grants a full window after the next unsubscribe",
2441
+ "ok": false
2442
+ },
2443
+ {
2444
+ "file": "resource-watch",
2445
+ "serial": true,
2446
+ "suite": [
2447
+ "resource watch \u2014 lifetime"
2448
+ ],
2449
+ "title": "cancels grace on reconnect and grants a full window after the next unsubscribe",
2450
+ "ok": false
2451
+ },
2452
+ {
2453
+ "file": "resource-watch",
2454
+ "serial": true,
2455
+ "suite": [
2456
+ "resource watch \u2014 lifetime"
2457
+ ],
2458
+ "title": "releases a watch when the client disconnects without unsubscribing",
2459
+ "ok": false
2460
+ },
2461
+ {
2462
+ "file": "resource-watch",
2463
+ "serial": true,
2464
+ "suite": [
2465
+ "resource watch \u2014 lifetime"
2466
+ ],
2467
+ "title": "releases a watch nobody ever subscribed to",
2468
+ "ok": false
2469
+ },
2470
+ {
2471
+ "file": "resource-watch",
2472
+ "serial": true,
2473
+ "suite": [
2474
+ "resource watch \u2014 lifetime"
2475
+ ],
2476
+ "title": "disposes every watch and returns the same shutdown promise",
2477
+ "ok": false
2478
+ },
2479
+ {
2480
+ "file": "resource-watch",
2481
+ "serial": true,
2482
+ "suite": [
2483
+ "resource watch \u2014 lifetime"
2484
+ ],
2485
+ "title": "waits for a blocked creation to settle before completing shutdown",
2486
+ "ok": false
2487
+ },
2488
+ {
2489
+ "file": "resource-watch",
2490
+ "serial": true,
2491
+ "suite": [
2492
+ "resource watch \u2014 lifetime"
2493
+ ],
2494
+ "title": "closes a native watcher if shutdown wins at its ready boundary",
2495
+ "ok": false
2496
+ },
2497
+ {
2498
+ "file": "resource-watch",
2499
+ "serial": true,
2500
+ "suite": [
2501
+ "resource watch \u2014 lifetime"
2502
+ ],
2503
+ "title": "drains in-flight creations and rejects new ones after shutdown",
2504
+ "ok": false
2505
+ },
2506
+ {
2507
+ "file": "resource",
2508
+ "serial": false,
2509
+ "suite": [
2510
+ "resource operations"
2511
+ ],
2512
+ "title": "reads a text file as utf-8 with a content type",
2513
+ "ok": true
2514
+ },
2515
+ {
2516
+ "file": "resource",
2517
+ "serial": false,
2518
+ "suite": [
2519
+ "resource operations"
2520
+ ],
2521
+ "title": "detects valid UTF-8 independently of the extension and reports known MIME types",
2522
+ "ok": true
2523
+ },
2524
+ {
2525
+ "file": "resource",
2526
+ "serial": false,
2527
+ "suite": [
2528
+ "resource operations"
2529
+ ],
2530
+ "title": "falls back to base64 when content is not valid UTF-8",
2531
+ "ok": true
2532
+ },
2533
+ {
2534
+ "file": "resource",
2535
+ "serial": false,
2536
+ "suite": [
2537
+ "resource operations"
2538
+ ],
2539
+ "title": "honours an explicitly requested encoding",
2540
+ "ok": true
2541
+ },
2542
+ {
2543
+ "file": "resource",
2544
+ "serial": false,
2545
+ "suite": [
2546
+ "resource operations"
2547
+ ],
2548
+ "title": "lists a directory with directories first",
2549
+ "ok": true
2550
+ },
2551
+ {
2552
+ "file": "resource",
2553
+ "serial": false,
2554
+ "suite": [
2555
+ "resource operations"
2556
+ ],
2557
+ "title": "resolves files and symlinks with canonical metadata",
2558
+ "ok": true
2559
+ },
2560
+ {
2561
+ "file": "resource",
2562
+ "serial": false,
2563
+ "suite": [
2564
+ "resource operations"
2565
+ ],
2566
+ "title": "writes, then reads back what it wrote",
2567
+ "ok": true
2568
+ },
2569
+ {
2570
+ "file": "resource",
2571
+ "serial": false,
2572
+ "suite": [
2573
+ "resource operations"
2574
+ ],
2575
+ "title": "reports a missing parent directory instead of creating it implicitly",
2576
+ "ok": true
2577
+ },
2578
+ {
2579
+ "file": "resource",
2580
+ "serial": false,
2581
+ "suite": [
2582
+ "resource operations"
2583
+ ],
2584
+ "title": "appends without clobbering",
2585
+ "ok": true
2586
+ },
2587
+ {
2588
+ "file": "resource",
2589
+ "serial": false,
2590
+ "suite": [
2591
+ "resource operations"
2592
+ ],
2593
+ "title": "refuses to overwrite when createOnly is set",
2594
+ "ok": true
2595
+ },
2596
+ {
2597
+ "file": "resource",
2598
+ "serial": false,
2599
+ "suite": [
2600
+ "resource operations"
2601
+ ],
2602
+ "title": "applies byte positions for truncate, append, and insert",
2603
+ "ok": true
2604
+ },
2605
+ {
2606
+ "file": "resource",
2607
+ "serial": false,
2608
+ "suite": [
2609
+ "resource operations"
2610
+ ],
2611
+ "title": "rejects invalid write modes and positions",
2612
+ "ok": true
2613
+ },
2614
+ {
2615
+ "file": "resource",
2616
+ "serial": false,
2617
+ "suite": [
2618
+ "resource operations"
2619
+ ],
2620
+ "title": "enforces ifMatch and serializes competing conditional writes",
2621
+ "ok": true
2622
+ },
2623
+ {
2624
+ "file": "resource",
2625
+ "serial": false,
2626
+ "suite": [
2627
+ "resource operations"
2628
+ ],
2629
+ "title": "makes directories with mkdir -p semantics",
2630
+ "ok": true
2631
+ },
2632
+ {
2633
+ "file": "resource",
2634
+ "serial": false,
2635
+ "suite": [
2636
+ "resource operations"
2637
+ ],
2638
+ "title": "copies and moves files",
2639
+ "ok": true
2640
+ },
2641
+ {
2642
+ "file": "resource",
2643
+ "serial": false,
2644
+ "suite": [
2645
+ "resource operations"
2646
+ ],
2647
+ "title": "fails a copy onto an existing destination when asked to",
2648
+ "ok": true
2649
+ },
2650
+ {
2651
+ "file": "resource",
2652
+ "serial": false,
2653
+ "suite": [
2654
+ "resource operations"
2655
+ ],
2656
+ "title": "deletes files, and directories only when recursion is requested",
2657
+ "ok": true
2658
+ },
2659
+ {
2660
+ "file": "resource",
2661
+ "serial": false,
2662
+ "suite": [
2663
+ "resource operations"
2664
+ ],
2665
+ "title": "reports a missing file as NotFound",
2666
+ "ok": true
2667
+ },
2668
+ {
2669
+ "file": "resource",
2670
+ "serial": false,
2671
+ "suite": [
2672
+ "resource operations"
2673
+ ],
2674
+ "title": "rejects a non-file scheme",
2675
+ "ok": true
2676
+ },
2677
+ {
2678
+ "file": "resource",
2679
+ "serial": false,
2680
+ "suite": [
2681
+ "resource operations"
2682
+ ],
2683
+ "title": "grants resourceRequest without tracking a ledger",
2684
+ "ok": true
2685
+ },
2686
+ {
2687
+ "file": "resource",
2688
+ "serial": false,
2689
+ "suite": [
2690
+ "resource roots"
2691
+ ],
2692
+ "title": "allows paths inside a configured root after canonicalization",
2693
+ "ok": true
2694
+ },
2695
+ {
2696
+ "file": "resource",
2697
+ "serial": false,
2698
+ "suite": [
2699
+ "resource roots"
2700
+ ],
2701
+ "title": "denies paths outside the configured roots, including prefix lookalikes",
2702
+ "ok": true
2703
+ },
2704
+ {
2705
+ "file": "resource",
2706
+ "serial": false,
2707
+ "suite": [
2708
+ "resource roots \u2014 symlink escape"
2709
+ ],
2710
+ "title": "resolves symlinks before checking the allowlist",
2711
+ "ok": true
2712
+ },
2713
+ {
2714
+ "file": "schema",
2715
+ "serial": false,
2716
+ "suite": [
2717
+ "wire schema"
2718
+ ],
2719
+ "title": "emits a conforming InitializeResult",
2720
+ "ok": true
2721
+ },
2722
+ {
2723
+ "file": "schema",
2724
+ "serial": false,
2725
+ "suite": [
2726
+ "wire schema"
2727
+ ],
2728
+ "title": "emits a conforming RootState snapshot",
2729
+ "ok": true
2730
+ },
2731
+ {
2732
+ "file": "schema",
2733
+ "serial": false,
2734
+ "suite": [
2735
+ "wire schema"
2736
+ ],
2737
+ "title": "emits conforming ActionEnvelopes",
2738
+ "ok": true
2739
+ },
2740
+ {
2741
+ "file": "schema",
2742
+ "serial": false,
2743
+ "suite": [
2744
+ "wire schema"
2745
+ ],
2746
+ "title": "fails validation for a structurally wrong action",
2747
+ "ok": true
2748
+ },
2749
+ {
2750
+ "file": "session-catalogue",
2751
+ "serial": false,
2752
+ "suite": [
2753
+ "session catalogue"
2754
+ ],
2755
+ "title": "returns most-recently-modified first, across working directories",
2756
+ "ok": true
2757
+ },
2758
+ {
2759
+ "file": "session-catalogue",
2760
+ "serial": false,
2761
+ "suite": [
2762
+ "session catalogue"
2763
+ ],
2764
+ "title": "paginates with an opaque cursor and stops at the end",
2765
+ "ok": true
2766
+ },
2767
+ {
2768
+ "file": "session-catalogue",
2769
+ "serial": false,
2770
+ "suite": [
2771
+ "session catalogue"
2772
+ ],
2773
+ "title": "rejects a malformed cursor with InvalidParams",
2774
+ "ok": true
2775
+ },
2776
+ {
2777
+ "file": "session-catalogue",
2778
+ "serial": false,
2779
+ "suite": [
2780
+ "session catalogue"
2781
+ ],
2782
+ "title": "titles a session by its name, falling back to the first user message",
2783
+ "ok": true
2784
+ },
2785
+ {
2786
+ "file": "session-catalogue",
2787
+ "serial": false,
2788
+ "suite": [
2789
+ "session catalogue"
2790
+ ],
2791
+ "title": "skips files that are not readable pi sessions",
2792
+ "ok": true
2793
+ },
2794
+ {
2795
+ "file": "session-catalogue",
2796
+ "serial": false,
2797
+ "suite": [
2798
+ "session catalogue"
2799
+ ],
2800
+ "title": "returns an empty catalogue when nothing exists yet",
2801
+ "ok": true
2802
+ },
2803
+ {
2804
+ "file": "session-catalogue",
2805
+ "serial": false,
2806
+ "suite": [
2807
+ "session catalogue"
2808
+ ],
2809
+ "title": "does not return a cached path after its session file is removed",
2810
+ "ok": true
2811
+ },
2812
+ {
2813
+ "file": "session-catalogue",
2814
+ "serial": false,
2815
+ "suite": [
2816
+ "live session catalogue overlays"
2817
+ ],
2818
+ "title": "reads live status after disk discovery rather than freezing request-start state",
2819
+ "ok": true
2820
+ },
2821
+ {
2822
+ "file": "session-catalogue",
2823
+ "serial": false,
2824
+ "suite": [
2825
+ "live session catalogue overlays"
2826
+ ],
2827
+ "title": "keeps a live entry stable as its file appears, without caching a nonexistent file",
2828
+ "ok": true
2829
+ },
2830
+ {
2831
+ "file": "session-catalogue",
2832
+ "serial": false,
2833
+ "suite": [
2834
+ "live session catalogue overlays"
2835
+ ],
2836
+ "title": "orders and paginates live summaries without duplicating their files",
2837
+ "ok": true
2838
+ },
2839
+ {
2840
+ "file": "session-catalogue",
2841
+ "serial": false,
2842
+ "suite": [
2843
+ "listSessions over the wire"
2844
+ ],
2845
+ "title": "serves a schema-conforming page",
2846
+ "ok": true
2847
+ },
2848
+ {
2849
+ "file": "session-config",
2850
+ "serial": false,
2851
+ "suite": [
2852
+ "resolveSessionConfig"
2853
+ ],
2854
+ "title": "returns a schema-conforming result",
2855
+ "ok": true
2856
+ },
2857
+ {
2858
+ "file": "session-config",
2859
+ "serial": false,
2860
+ "suite": [
2861
+ "resolveSessionConfig"
2862
+ ],
2863
+ "title": "reports what a directory with no project resources would do",
2864
+ "ok": true
2865
+ },
2866
+ {
2867
+ "file": "session-config",
2868
+ "serial": false,
2869
+ "suite": [
2870
+ "resolveSessionConfig"
2871
+ ],
2872
+ "title": "re-resolves against whatever directory the client is asking about",
2873
+ "ok": true
2874
+ },
2875
+ {
2876
+ "file": "session-config",
2877
+ "serial": false,
2878
+ "suite": [
2879
+ "resolveSessionConfig"
2880
+ ],
2881
+ "title": "offers no dynamic completions",
2882
+ "ok": true
2883
+ },
2884
+ {
2885
+ "file": "session-config",
2886
+ "serial": false,
2887
+ "suite": [
2888
+ "model selection"
2889
+ ],
2890
+ "title": "has a model selected before the agent has even started",
2891
+ "ok": true
2892
+ },
2893
+ {
2894
+ "file": "session-config",
2895
+ "serial": false,
2896
+ "suite": [
2897
+ "model selection"
2898
+ ],
2899
+ "title": "publishes the model and config actually in effect as the chat draft",
2900
+ "ok": true
2901
+ },
2902
+ {
2903
+ "file": "session-config",
2904
+ "serial": false,
2905
+ "suite": [
2906
+ "model selection"
2907
+ ],
2908
+ "title": "applies the model a client picked, before the prompt runs",
2909
+ "ok": true
2910
+ },
2911
+ {
2912
+ "file": "session-config",
2913
+ "serial": false,
2914
+ "suite": [
2915
+ "model selection"
2916
+ ],
2917
+ "title": "runs on the current model when the message carries no selection",
2918
+ "ok": true
2919
+ },
2920
+ {
2921
+ "file": "session-disposal",
2922
+ "serial": false,
2923
+ "suite": [
2924
+ "session disposal"
2925
+ ],
2926
+ "title": "keeps the session usable when durable deletion fails",
2927
+ "ok": true
2928
+ },
2929
+ {
2930
+ "file": "session-disposal",
2931
+ "serial": false,
2932
+ "suite": [
2933
+ "session disposal"
2934
+ ],
2935
+ "title": "coalesces concurrent requests and rejects new work until deletion settles",
2936
+ "ok": true
2937
+ },
2938
+ {
2939
+ "file": "session-disposal",
2940
+ "serial": false,
2941
+ "suite": [
2942
+ "session disposal"
2943
+ ],
2944
+ "title": "quiesces an active backend and commits removal despite cleanup failure",
2945
+ "ok": true
2946
+ },
2947
+ {
2948
+ "file": "session-disposal",
2949
+ "serial": false,
2950
+ "suite": [
2951
+ "session disposal"
2952
+ ],
2953
+ "title": "resumes queued work when backend quiescence fails",
2954
+ "ok": true
2955
+ },
2956
+ {
2957
+ "file": "session-disposal",
2958
+ "serial": false,
2959
+ "suite": [
2960
+ "session disposal"
2961
+ ],
2962
+ "title": "drains an in-flight model selection before deleting",
2963
+ "ok": true
2964
+ },
2965
+ {
2966
+ "file": "session-disposal",
2967
+ "serial": false,
2968
+ "suite": [
2969
+ "session disposal"
2970
+ ],
2971
+ "title": "disposes a backend that finishes starting after removal",
2972
+ "ok": true
2973
+ },
2974
+ {
2975
+ "file": "session-hydration",
2976
+ "serial": false,
2977
+ "suite": [
2978
+ "opening a session from the catalogue"
2979
+ ],
2980
+ "title": "hydrates a catalogued session and counts it as active",
2981
+ "ok": true
2982
+ },
2983
+ {
2984
+ "file": "session-hydration",
2985
+ "serial": false,
2986
+ "suite": [
2987
+ "opening a session from the catalogue"
2988
+ ],
2989
+ "title": "rebuilds the transcript onto the chat channel",
2990
+ "ok": true
2991
+ },
2992
+ {
2993
+ "file": "session-hydration",
2994
+ "serial": false,
2995
+ "suite": [
2996
+ "opening a session from the catalogue"
2997
+ ],
2998
+ "title": "pairs each tool call with the result that followed it",
2999
+ "ok": true
3000
+ },
3001
+ {
3002
+ "file": "session-hydration",
3003
+ "serial": false,
3004
+ "suite": [
3005
+ "opening a session from the catalogue"
3006
+ ],
3007
+ "title": "still answers NotFound for a session that really does not exist",
3008
+ "ok": true
3009
+ },
3010
+ {
3011
+ "file": "session-hydration",
3012
+ "serial": false,
3013
+ "suite": [
3014
+ "opening a session from the catalogue"
3015
+ ],
3016
+ "title": "restores images stored in pi user messages",
3017
+ "ok": true
3018
+ },
3019
+ {
3020
+ "file": "session-hydration",
3021
+ "serial": false,
3022
+ "suite": [
3023
+ "opening a session from the catalogue"
3024
+ ],
3025
+ "title": "hydrates from either half of the pair",
3026
+ "ok": true
3027
+ },
3028
+ {
3029
+ "file": "session-hydration",
3030
+ "serial": false,
3031
+ "suite": [
3032
+ "opening a session from the catalogue"
3033
+ ],
3034
+ "title": "coalesces concurrent session and chat hydration",
3035
+ "ok": true
3036
+ },
3037
+ {
3038
+ "file": "session-hydration",
3039
+ "serial": false,
3040
+ "suite": [],
3041
+ "title": "preserves catalogue modifiedAt when a disk session becomes a live overlay",
3042
+ "ok": true
3043
+ },
3044
+ {
3045
+ "file": "session-lifecycle",
3046
+ "serial": false,
3047
+ "suite": [
3048
+ "session lifecycle"
3049
+ ],
3050
+ "title": "creates a session at the client-chosen URI and reports it ready",
3051
+ "ok": true
3052
+ },
3053
+ {
3054
+ "file": "session-lifecycle",
3055
+ "serial": false,
3056
+ "suite": [
3057
+ "session lifecycle"
3058
+ ],
3059
+ "title": "uses the first user message as an unnamed session's display title",
3060
+ "ok": true
3061
+ },
3062
+ {
3063
+ "file": "session-lifecycle",
3064
+ "serial": false,
3065
+ "suite": [
3066
+ "session lifecycle"
3067
+ ],
3068
+ "title": "uses pi's session id as the URI's uuid",
3069
+ "ok": true
3070
+ },
3071
+ {
3072
+ "file": "session-lifecycle",
3073
+ "serial": false,
3074
+ "suite": [
3075
+ "session lifecycle"
3076
+ ],
3077
+ "title": "announces the new session on the root channel",
3078
+ "ok": true
3079
+ },
3080
+ {
3081
+ "file": "session-lifecycle",
3082
+ "serial": false,
3083
+ "suite": [
3084
+ "session lifecycle"
3085
+ ],
3086
+ "title": "rejects a duplicate session URI with SessionAlreadyExists",
3087
+ "ok": true
3088
+ },
3089
+ {
3090
+ "file": "session-lifecycle",
3091
+ "serial": false,
3092
+ "suite": [
3093
+ "session lifecycle"
3094
+ ],
3095
+ "title": "rejects an unknown provider with ProviderNotFound",
3096
+ "ok": true
3097
+ },
3098
+ {
3099
+ "file": "session-lifecycle",
3100
+ "serial": false,
3101
+ "suite": [
3102
+ "session lifecycle"
3103
+ ],
3104
+ "title": "honours a client-supplied working directory",
3105
+ "ok": true
3106
+ },
3107
+ {
3108
+ "file": "session-lifecycle",
3109
+ "serial": false,
3110
+ "suite": [
3111
+ "session lifecycle"
3112
+ ],
3113
+ "title": "tracks the active session count in root state",
3114
+ "ok": true
3115
+ },
3116
+ {
3117
+ "file": "session-lifecycle",
3118
+ "serial": false,
3119
+ "suite": [
3120
+ "session lifecycle"
3121
+ ],
3122
+ "title": "disposes a session, drops its channel, and announces the removal",
3123
+ "ok": true
3124
+ },
3125
+ {
3126
+ "file": "session-lifecycle",
3127
+ "serial": false,
3128
+ "suite": [
3129
+ "session lifecycle"
3130
+ ],
3131
+ "title": "does not let session disposal target another channel kind",
3132
+ "ok": true
3133
+ },
3134
+ {
3135
+ "file": "session-lifecycle",
3136
+ "serial": false,
3137
+ "suite": [
3138
+ "session lifecycle"
3139
+ ],
3140
+ "title": "rejects disposing a session that does not exist",
3141
+ "ok": true
3142
+ },
3143
+ {
3144
+ "file": "session-lifecycle",
3145
+ "serial": false,
3146
+ "suite": [
3147
+ "session lifecycle"
3148
+ ],
3149
+ "title": "accepts session/titleChanged from a client",
3150
+ "ok": true
3151
+ },
3152
+ {
3153
+ "file": "session-lifecycle",
3154
+ "serial": false,
3155
+ "suite": [
3156
+ "session lifecycle"
3157
+ ],
3158
+ "title": "applies VS Code's chat-addressed rename to the owning session",
3159
+ "ok": true
3160
+ },
3161
+ {
3162
+ "file": "session-lifecycle",
3163
+ "serial": false,
3164
+ "suite": [
3165
+ "session lifecycle"
3166
+ ],
3167
+ "title": "declines VS Code's active client without blocking session creation",
3168
+ "ok": true
3169
+ },
3170
+ {
3171
+ "file": "session-lifecycle",
3172
+ "serial": false,
3173
+ "suite": [
3174
+ "renaming a session"
3175
+ ],
3176
+ "title": "records the new name on the session",
3177
+ "ok": true
3178
+ },
3179
+ {
3180
+ "file": "session-lifecycle",
3181
+ "serial": false,
3182
+ "suite": [
3183
+ "renaming a session"
3184
+ ],
3185
+ "title": "does not create a file for a session that never got a reply",
3186
+ "ok": true
3187
+ },
3188
+ {
3189
+ "file": "session-lifecycle",
3190
+ "serial": false,
3191
+ "suite": [
3192
+ "renaming a session"
3193
+ ],
3194
+ "title": "mirrors the name onto the chat and the catalogue entry",
3195
+ "ok": true
3196
+ },
3197
+ {
3198
+ "file": "session-storage",
3199
+ "serial": true,
3200
+ "suite": [],
3201
+ "title": "keeps the default catalogue and Pi session writer on the same isolated profile",
3202
+ "ok": true
3203
+ },
3204
+ {
3205
+ "file": "session-summary",
3206
+ "serial": false,
3207
+ "suite": [
3208
+ "session chat aggregation"
3209
+ ],
3210
+ "title": "passes through single-chat activity but preserves session-owned and unknown flags",
3211
+ "ok": true
3212
+ },
3213
+ {
3214
+ "file": "session-summary",
3215
+ "serial": false,
3216
+ "suite": [
3217
+ "session chat aggregation"
3218
+ ],
3219
+ "title": "uses default chat activity but the latest timestamp, comparing instants rather than strings",
3220
+ "ok": true
3221
+ },
3222
+ {
3223
+ "file": "session-summary",
3224
+ "serial": false,
3225
+ "suite": [
3226
+ "session chat aggregation"
3227
+ ],
3228
+ "title": "promotes Error and InputNeeded, preferring the most recent blocker of the winning kind",
3229
+ "ok": true
3230
+ },
3231
+ {
3232
+ "file": "session-summary",
3233
+ "serial": false,
3234
+ "suite": [
3235
+ "session chat aggregation"
3236
+ ],
3237
+ "title": "handles an empty catalogue and chooses stable ties and valid timestamps",
3238
+ "ok": true
3239
+ },
3240
+ {
3241
+ "file": "session-summary",
3242
+ "serial": false,
3243
+ "suite": [
3244
+ "session summary over the wire"
3245
+ ],
3246
+ "title": "projects an active turn closed by backend startup failure",
3247
+ "ok": true
3248
+ },
3249
+ {
3250
+ "file": "session-summary",
3251
+ "serial": false,
3252
+ "suite": [
3253
+ "session summary over the wire"
3254
+ ],
3255
+ "title": "publishes exact start deltas and lists an unpersisted session for new clients",
3256
+ "ok": true
3257
+ },
3258
+ {
3259
+ "file": "session-summary",
3260
+ "serial": false,
3261
+ "suite": [
3262
+ "session summary over the wire"
3263
+ ],
3264
+ "title": "clears activity through a full upsert and sends no redundant root updates or delta projections",
3265
+ "ok": true
3266
+ },
3267
+ {
3268
+ "file": "session-summary",
3269
+ "serial": false,
3270
+ "suite": [
3271
+ "session summary over the wire"
3272
+ ],
3273
+ "title": "projects complete and ignores rejected/no-op actions",
3274
+ "ok": true
3275
+ },
3276
+ {
3277
+ "file": "session-summary",
3278
+ "serial": false,
3279
+ "suite": [
3280
+ "session summary over the wire"
3281
+ ],
3282
+ "title": "projects cancel and ignores rejected/no-op actions",
3283
+ "ok": true
3284
+ },
3285
+ {
3286
+ "file": "session-summary",
3287
+ "serial": false,
3288
+ "suite": [
3289
+ "session summary over the wire"
3290
+ ],
3291
+ "title": "projects error and ignores rejected/no-op actions",
3292
+ "ok": true
3293
+ },
3294
+ {
3295
+ "file": "session-summary",
3296
+ "serial": false,
3297
+ "suite": [
3298
+ "session summary over the wire"
3299
+ ],
3300
+ "title": "projects truncate and ignores rejected/no-op actions",
3301
+ "ok": true
3302
+ },
3303
+ {
3304
+ "file": "session-summary",
3305
+ "serial": false,
3306
+ "suite": [
3307
+ "session summary over the wire"
3308
+ ],
3309
+ "title": "replays running session projections to the same state as snapshot fallback",
3310
+ "ok": true
3311
+ },
3312
+ {
3313
+ "file": "session-summary",
3314
+ "serial": false,
3315
+ "suite": [
3316
+ "session summary over the wire"
3317
+ ],
3318
+ "title": "replays completed session projections to the same state as snapshot fallback",
3319
+ "ok": true
3320
+ },
3321
+ {
3322
+ "file": "subscriptions",
3323
+ "serial": false,
3324
+ "suite": [
3325
+ "subscriptions"
3326
+ ],
3327
+ "title": "returns the current state as a snapshot",
3328
+ "ok": true
3329
+ },
3330
+ {
3331
+ "file": "subscriptions",
3332
+ "serial": false,
3333
+ "suite": [
3334
+ "subscriptions"
3335
+ ],
3336
+ "title": "rejects a channel scheme the host does not serve",
3337
+ "ok": true
3338
+ },
3339
+ {
3340
+ "file": "subscriptions",
3341
+ "serial": false,
3342
+ "suite": [
3343
+ "subscriptions"
3344
+ ],
3345
+ "title": "rejects a well-formed URI for a channel that does not exist",
3346
+ "ok": true
3347
+ },
3348
+ {
3349
+ "file": "subscriptions",
3350
+ "serial": false,
3351
+ "suite": [
3352
+ "action dispatch"
3353
+ ],
3354
+ "title": "echoes a client-dispatchable action with its origin",
3355
+ "ok": true
3356
+ },
3357
+ {
3358
+ "file": "subscriptions",
3359
+ "serial": false,
3360
+ "suite": [
3361
+ "action dispatch"
3362
+ ],
3363
+ "title": "rejects an action that is not client-dispatchable",
3364
+ "ok": true
3365
+ },
3366
+ {
3367
+ "file": "subscriptions",
3368
+ "serial": false,
3369
+ "suite": [
3370
+ "action dispatch"
3371
+ ],
3372
+ "title": "silently ignores an action for a channel that does not exist",
3373
+ "ok": true
3374
+ },
3375
+ {
3376
+ "file": "subscriptions",
3377
+ "serial": false,
3378
+ "suite": [
3379
+ "action dispatch"
3380
+ ],
3381
+ "title": "broadcasts to every subscriber and allocates one seq per action",
3382
+ "ok": true
3383
+ },
3384
+ {
3385
+ "file": "subscriptions",
3386
+ "serial": false,
3387
+ "suite": [
3388
+ "action dispatch"
3389
+ ],
3390
+ "title": "treats root/configChanged as a no-op until the host declares a config schema",
3391
+ "ok": true
3392
+ },
3393
+ {
3394
+ "file": "subscriptions",
3395
+ "serial": false,
3396
+ "suite": [
3397
+ "action dispatch"
3398
+ ],
3399
+ "title": "stops delivering after unsubscribe",
3400
+ "ok": true
3401
+ },
3402
+ {
3403
+ "file": "terminal-service",
3404
+ "serial": false,
3405
+ "suite": [
3406
+ "terminal service"
3407
+ ],
3408
+ "title": "creates a client-owned terminal and publishes its authoritative state",
3409
+ "ok": true
3410
+ },
3411
+ {
3412
+ "file": "terminal-service",
3413
+ "serial": false,
3414
+ "suite": [
3415
+ "terminal service"
3416
+ ],
3417
+ "title": "forwards output, input, resize, title, and clear without interpreting VT data",
3418
+ "ok": true
3419
+ },
3420
+ {
3421
+ "file": "terminal-service",
3422
+ "serial": false,
3423
+ "suite": [
3424
+ "terminal service"
3425
+ ],
3426
+ "title": "batches burst output and flushes pending data before exit",
3427
+ "ok": true
3428
+ },
3429
+ {
3430
+ "file": "terminal-service",
3431
+ "serial": false,
3432
+ "suite": [
3433
+ "terminal service"
3434
+ ],
3435
+ "title": "restricts interaction and claim transfer without preventing cleanup",
3436
+ "ok": true
3437
+ },
3438
+ {
3439
+ "file": "terminal-service",
3440
+ "serial": false,
3441
+ "suite": [
3442
+ "terminal service"
3443
+ ],
3444
+ "title": "spawns only once when duplicate creates race",
3445
+ "ok": true
3446
+ },
3447
+ {
3448
+ "file": "terminal-service",
3449
+ "serial": false,
3450
+ "suite": [
3451
+ "terminal service"
3452
+ ],
3453
+ "title": "rejects unsupported claims and invalid creation parameters before spawning",
3454
+ "ok": true
3455
+ },
3456
+ {
3457
+ "file": "terminal-service",
3458
+ "serial": false,
3459
+ "suite": [
3460
+ "terminal service"
3461
+ ],
3462
+ "title": "reserves the provider session scheme from terminal creation",
3463
+ "ok": true
3464
+ },
3465
+ {
3466
+ "file": "terminal-service",
3467
+ "serial": false,
3468
+ "suite": [
3469
+ "terminal service"
3470
+ ],
3471
+ "title": "does not let terminal disposal target another channel kind",
3472
+ "ok": true
3473
+ },
3474
+ {
3475
+ "file": "terminal-service",
3476
+ "serial": false,
3477
+ "suite": [
3478
+ "terminal service"
3479
+ ],
3480
+ "title": "records natural exit and disposes exited or running terminals",
3481
+ "ok": true
3482
+ },
3483
+ {
3484
+ "file": "terminal-service",
3485
+ "serial": false,
3486
+ "suite": [
3487
+ "terminal service"
3488
+ ],
3489
+ "title": "keeps the PTY attached across a same-host reconnect",
3490
+ "ok": true
3491
+ },
3492
+ {
3493
+ "file": "terminal-service",
3494
+ "serial": false,
3495
+ "suite": [
3496
+ "terminal service"
3497
+ ],
3498
+ "title": "falls back to a live terminal snapshot after replay eviction",
3499
+ "ok": true
3500
+ },
3501
+ {
3502
+ "file": "terminal-service",
3503
+ "serial": false,
3504
+ "suite": [
3505
+ "terminal service"
3506
+ ],
3507
+ "title": "bounds snapshot scrollback while retaining the newest VT stream",
3508
+ "ok": true
3509
+ },
3510
+ {
3511
+ "file": "terminal-service",
3512
+ "serial": false,
3513
+ "suite": [
3514
+ "terminal service"
3515
+ ],
3516
+ "title": "kills running PTYs during service shutdown",
3517
+ "ok": true
3518
+ },
3519
+ {
3520
+ "file": "terminal-service",
3521
+ "serial": false,
3522
+ "suite": [],
3523
+ "title": "returns MethodNotFound when terminal support is not wired",
3524
+ "ok": true
3525
+ },
3526
+ {
3527
+ "file": "truncate",
3528
+ "serial": false,
3529
+ "suite": [
3530
+ "truncation anchors"
3531
+ ],
3532
+ "title": "anchors a turn on its last entry, not its first",
3533
+ "ok": true
3534
+ },
3535
+ {
3536
+ "file": "truncate",
3537
+ "serial": false,
3538
+ "suite": [
3539
+ "truncation anchors"
3540
+ ],
3541
+ "title": "anchors 'clear everything' on the first user entry",
3542
+ "ok": true
3543
+ },
3544
+ {
3545
+ "file": "truncate",
3546
+ "serial": false,
3547
+ "suite": [
3548
+ "chat/truncated"
3549
+ ],
3550
+ "title": "moves pi's leaf to the named turn, not just the client's view",
3551
+ "ok": true
3552
+ },
3553
+ {
3554
+ "file": "truncate",
3555
+ "serial": false,
3556
+ "suite": [
3557
+ "chat/truncated"
3558
+ ],
3559
+ "title": "maps 'clear everything' onto the first entry",
3560
+ "ok": true
3561
+ },
3562
+ {
3563
+ "file": "truncate",
3564
+ "serial": false,
3565
+ "suite": [
3566
+ "chat/truncated"
3567
+ ],
3568
+ "title": "refuses a turn it cannot anchor, instead of diverging",
3569
+ "ok": true
3570
+ },
3571
+ {
3572
+ "file": "tunnel",
3573
+ "serial": false,
3574
+ "suite": [
3575
+ "tunnel discovery contract"
3576
+ ],
3577
+ "title": "uses the shared discovery labels and port",
3578
+ "ok": true
3579
+ },
3580
+ {
3581
+ "file": "tunnel",
3582
+ "serial": false,
3583
+ "suite": [
3584
+ "tunnel discovery contract"
3585
+ ],
3586
+ "title": "keeps the identity label out of the display name",
3587
+ "ok": true
3588
+ },
3589
+ {
3590
+ "file": "tunnel",
3591
+ "serial": false,
3592
+ "suite": [
3593
+ "tunnel discovery contract"
3594
+ ],
3595
+ "title": "folds a name the way VS Code does",
3596
+ "ok": true
3597
+ },
3598
+ {
3599
+ "file": "tunnel",
3600
+ "serial": false,
3601
+ "suite": [
3602
+ "devtunnel account and catalogue"
3603
+ ],
3604
+ "title": "reports when the CLI is not installed",
3605
+ "ok": true
3606
+ },
3607
+ {
3608
+ "file": "tunnel",
3609
+ "serial": false,
3610
+ "suite": [
3611
+ "devtunnel account and catalogue"
3612
+ ],
3613
+ "title": "requires a logged-in account",
3614
+ "ok": true
3615
+ },
3616
+ {
3617
+ "file": "tunnel",
3618
+ "serial": false,
3619
+ "suite": [
3620
+ "devtunnel account and catalogue"
3621
+ ],
3622
+ "title": "reports account inspection failures",
3623
+ "ok": true
3624
+ },
3625
+ {
3626
+ "file": "tunnel",
3627
+ "serial": false,
3628
+ "suite": [
3629
+ "devtunnel account and catalogue"
3630
+ ],
3631
+ "title": "finds this host's first labelled tunnel",
3632
+ "ok": true
3633
+ },
3634
+ {
3635
+ "file": "tunnel",
3636
+ "serial": false,
3637
+ "suite": [
3638
+ "devtunnel account and catalogue"
3639
+ ],
3640
+ "title": "returns no tunnel for a successful empty listing",
3641
+ "ok": true
3642
+ },
3643
+ {
3644
+ "file": "tunnel",
3645
+ "serial": false,
3646
+ "suite": [
3647
+ "devtunnel account and catalogue"
3648
+ ],
3649
+ "title": "reports tunnel listing failures and malformed responses",
3650
+ "ok": true
3651
+ },
3652
+ {
3653
+ "file": "tunnel",
3654
+ "serial": false,
3655
+ "suite": [
3656
+ "devtunnel account and catalogue"
3657
+ ],
3658
+ "title": "creates a tunnel with identity, protocol, launcher, and display labels",
3659
+ "ok": true
3660
+ },
3661
+ {
3662
+ "file": "tunnel",
3663
+ "serial": false,
3664
+ "suite": [
3665
+ "devtunnel account and catalogue"
3666
+ ],
3667
+ "title": "rejects failed or malformed tunnel creation",
3668
+ "ok": true
3669
+ },
3670
+ {
3671
+ "file": "tunnel",
3672
+ "serial": false,
3673
+ "suite": [
3674
+ "devtunnel account and catalogue"
3675
+ ],
3676
+ "title": "renames a tunnel without disturbing reserved labels",
3677
+ "ok": true
3678
+ },
3679
+ {
3680
+ "file": "tunnel",
3681
+ "serial": false,
3682
+ "suite": [
3683
+ "devtunnel account and catalogue"
3684
+ ],
3685
+ "title": "reports a failed rename",
3686
+ "ok": true
3687
+ },
3688
+ {
3689
+ "file": "tunnel",
3690
+ "serial": false,
3691
+ "suite": [
3692
+ "devtunnel port"
3693
+ ],
3694
+ "title": "creates port 31546 when a successful listing is empty",
3695
+ "ok": true
3696
+ },
3697
+ {
3698
+ "file": "tunnel",
3699
+ "serial": false,
3700
+ "suite": [
3701
+ "devtunnel port"
3702
+ ],
3703
+ "title": "keeps an existing HTTP port",
3704
+ "ok": true
3705
+ },
3706
+ {
3707
+ "file": "tunnel",
3708
+ "serial": false,
3709
+ "suite": [
3710
+ "devtunnel port"
3711
+ ],
3712
+ "title": "replaces an old HTTPS port with an HTTP port",
3713
+ "ok": true
3714
+ },
3715
+ {
3716
+ "file": "tunnel",
3717
+ "serial": false,
3718
+ "suite": [
3719
+ "devtunnel port"
3720
+ ],
3721
+ "title": "does not discard port-specific access control while migrating",
3722
+ "ok": true
3723
+ },
3724
+ {
3725
+ "file": "tunnel",
3726
+ "serial": false,
3727
+ "suite": [
3728
+ "devtunnel port"
3729
+ ],
3730
+ "title": "uses current port details when the protocol changes during inspection",
3731
+ "ok": true
3732
+ },
3733
+ {
3734
+ "file": "tunnel",
3735
+ "serial": false,
3736
+ "suite": [
3737
+ "devtunnel port"
3738
+ ],
3739
+ "title": "rejects malformed port inspection output",
3740
+ "ok": true
3741
+ },
3742
+ {
3743
+ "file": "tunnel",
3744
+ "serial": false,
3745
+ "suite": [
3746
+ "devtunnel port"
3747
+ ],
3748
+ "title": "reports listing, inspection, deletion, and creation failures",
3749
+ "ok": true
3750
+ },
3751
+ {
3752
+ "file": "upstream-workarounds",
3753
+ "serial": false,
3754
+ "suite": [
3755
+ "upstream workarounds"
3756
+ ],
3757
+ "title": "still needs the dangling-$ref strip",
3758
+ "ok": true
3759
+ },
3760
+ {
3761
+ "file": "upstream-workarounds",
3762
+ "serial": false,
3763
+ "suite": [
3764
+ "upstream workarounds"
3765
+ ],
3766
+ "title": "still needs every KNOWN_BITSET_ENUMS entry",
3767
+ "ok": true
3768
+ },
3769
+ {
3770
+ "file": "uri",
3771
+ "serial": false,
3772
+ "suite": [
3773
+ "file URI conversion"
3774
+ ],
3775
+ "title": "decodes percent-escapes",
3776
+ "ok": true
3777
+ },
3778
+ {
3779
+ "file": "uri",
3780
+ "serial": false,
3781
+ "suite": [
3782
+ "file URI conversion"
3783
+ ],
3784
+ "title": "round-trips a path",
3785
+ "ok": true
3786
+ },
3787
+ {
3788
+ "file": "uri",
3789
+ "serial": false,
3790
+ "suite": [
3791
+ "file URI conversion"
3792
+ ],
3793
+ "title": "passes a bare path through",
3794
+ "ok": true
3795
+ },
3796
+ {
3797
+ "file": "uri",
3798
+ "serial": false,
3799
+ "suite": [
3800
+ "file URI conversion"
3801
+ ],
3802
+ "title": "refuses a URI naming a remote host",
3803
+ "ok": true
3804
+ },
3805
+ {
3806
+ "file": "watch-events",
3807
+ "serial": false,
3808
+ "suite": [],
3809
+ "title": "watch assertions share a reader and retain the entire batch, even after a match",
3810
+ "ok": true
3811
+ },
3812
+ {
3813
+ "file": "watch-events",
3814
+ "serial": false,
3815
+ "suite": [],
3816
+ "title": "a timed-out assertion neither steals the next batch nor accepts events before its checkpoint",
3817
+ "ok": true
3818
+ },
3819
+ {
3820
+ "file": "watch-events",
3821
+ "serial": false,
3822
+ "suite": [],
3823
+ "title": "reports a reader failure during cleanup even without a waiting assertion",
3824
+ "ok": true
3825
+ },
3826
+ {
3827
+ "file": "watch-events",
3828
+ "serial": false,
3829
+ "suite": [],
3830
+ "title": "closing the journal settles pending assertions and the sole subscription reader",
3831
+ "ok": true
3832
+ }
3833
+ ]