@maudecode/talaria-web 1.16.1 → 1.18.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 (445) hide show
  1. package/_release.json +8 -8
  2. package/dist/api/auth-raw.d.ts +1 -1
  3. package/dist/api/auth-raw.js +4 -4
  4. package/dist/api/auth-raw.js.map +1 -1
  5. package/dist/api/automation-raw.d.ts +6 -0
  6. package/dist/api/automation-raw.js +59 -9
  7. package/dist/api/automation-raw.js.map +1 -1
  8. package/dist/api/automation-router.d.ts +163 -10
  9. package/dist/api/automation-router.js +25 -8
  10. package/dist/api/automation-router.js.map +1 -1
  11. package/dist/api/chat-router.d.ts +700 -15
  12. package/dist/api/chat-router.js +74 -55
  13. package/dist/api/chat-router.js.map +1 -1
  14. package/dist/api/git-router.d.ts +47 -2
  15. package/dist/api/git-router.js +31 -22
  16. package/dist/api/git-router.js.map +1 -1
  17. package/dist/api/raw-routes.d.ts +14 -0
  18. package/dist/api/raw-routes.js +277 -36
  19. package/dist/api/raw-routes.js.map +1 -1
  20. package/dist/api/router.d.ts +10 -0
  21. package/dist/api/router.js +10 -8
  22. package/dist/api/router.js.map +1 -1
  23. package/dist/api/sessions-router.d.ts +1710 -73
  24. package/dist/api/sessions-router.js +164 -10
  25. package/dist/api/sessions-router.js.map +1 -1
  26. package/dist/api/settings-router.d.ts +132 -2
  27. package/dist/api/settings-router.js +15 -5
  28. package/dist/api/settings-router.js.map +1 -1
  29. package/dist/api/sse-routes.d.ts +16 -3
  30. package/dist/api/sse-routes.js +194 -67
  31. package/dist/api/sse-routes.js.map +1 -1
  32. package/dist/api/tools-raw.js +12 -25
  33. package/dist/api/tools-raw.js.map +1 -1
  34. package/dist/api/tools-router.d.ts +425 -19
  35. package/dist/api/tools-router.js +157 -26
  36. package/dist/api/tools-router.js.map +1 -1
  37. package/dist/app.d.ts +0 -9377
  38. package/dist/app.js +42 -17
  39. package/dist/app.js.map +1 -1
  40. package/dist/auth/gate.js +8 -2
  41. package/dist/auth/gate.js.map +1 -1
  42. package/dist/auth/oidc.d.ts +5 -2
  43. package/dist/auth/oidc.js +8 -7
  44. package/dist/auth/oidc.js.map +1 -1
  45. package/dist/bin/talaria-web.js +1 -1
  46. package/dist/bin/talaria-web.js.map +1 -1
  47. package/dist/cli/dotenv.js +1 -0
  48. package/dist/cli/dotenv.js.map +1 -1
  49. package/dist/config/agent-config.d.ts +2 -0
  50. package/dist/config/agent-config.js +12 -2
  51. package/dist/config/agent-config.js.map +1 -1
  52. package/dist/config.d.ts +2 -0
  53. package/dist/config.js +5 -1
  54. package/dist/config.js.map +1 -1
  55. package/dist/http/context.d.ts +20 -3
  56. package/dist/http/context.js +41 -8
  57. package/dist/http/context.js.map +1 -1
  58. package/dist/http/csp.d.ts +2 -1
  59. package/dist/http/csp.js +3 -2
  60. package/dist/http/csp.js.map +1 -1
  61. package/dist/onboarding.js +4 -0
  62. package/dist/onboarding.js.map +1 -1
  63. package/dist/profiles/profiles.d.ts +10 -0
  64. package/dist/profiles/profiles.js +40 -2
  65. package/dist/profiles/profiles.js.map +1 -1
  66. package/dist/providers/catalog.d.ts +101 -8
  67. package/dist/providers/catalog.js +463 -123
  68. package/dist/providers/catalog.js.map +1 -1
  69. package/dist/raster-image.d.ts +7 -0
  70. package/dist/raster-image.js +267 -0
  71. package/dist/raster-image.js.map +1 -0
  72. package/dist/redact.d.ts +1 -0
  73. package/dist/redact.js +354 -44
  74. package/dist/redact.js.map +1 -1
  75. package/dist/runtime.js +111 -27
  76. package/dist/runtime.js.map +1 -1
  77. package/dist/server.js +5 -0
  78. package/dist/server.js.map +1 -1
  79. package/dist/sessions/anchor.d.ts +2 -0
  80. package/dist/sessions/anchor.js +8 -3
  81. package/dist/sessions/anchor.js.map +1 -1
  82. package/dist/sessions/background-tasks.d.ts +2 -9
  83. package/dist/sessions/background-tasks.js +2 -12
  84. package/dist/sessions/background-tasks.js.map +1 -1
  85. package/dist/sessions/claude-code.d.ts +19 -0
  86. package/dist/sessions/claude-code.js +250 -0
  87. package/dist/sessions/claude-code.js.map +1 -0
  88. package/dist/sessions/cli-sessions.d.ts +15 -4
  89. package/dist/sessions/cli-sessions.js +120 -29
  90. package/dist/sessions/cli-sessions.js.map +1 -1
  91. package/dist/sessions/completions.d.ts +61 -9
  92. package/dist/sessions/completions.js +282 -34
  93. package/dist/sessions/completions.js.map +1 -1
  94. package/dist/sessions/compress.d.ts +14 -1
  95. package/dist/sessions/compress.js +52 -11
  96. package/dist/sessions/compress.js.map +1 -1
  97. package/dist/sessions/export.d.ts +5 -0
  98. package/dist/sessions/export.js +30 -0
  99. package/dist/sessions/export.js.map +1 -1
  100. package/dist/sessions/gateway-watcher.d.ts +7 -3
  101. package/dist/sessions/gateway-watcher.js +31 -19
  102. package/dist/sessions/gateway-watcher.js.map +1 -1
  103. package/dist/sessions/handoff.d.ts +32 -0
  104. package/dist/sessions/handoff.js +114 -0
  105. package/dist/sessions/handoff.js.map +1 -0
  106. package/dist/sessions/journal.d.ts +8 -0
  107. package/dist/sessions/journal.js +44 -10
  108. package/dist/sessions/journal.js.map +1 -1
  109. package/dist/sessions/list.d.ts +13 -3
  110. package/dist/sessions/list.js +46 -15
  111. package/dist/sessions/list.js.map +1 -1
  112. package/dist/sessions/merge.d.ts +53 -5
  113. package/dist/sessions/merge.js +219 -23
  114. package/dist/sessions/merge.js.map +1 -1
  115. package/dist/sessions/recovery.d.ts +22 -0
  116. package/dist/sessions/recovery.js +506 -0
  117. package/dist/sessions/recovery.js.map +1 -0
  118. package/dist/sessions/relay.d.ts +21 -2
  119. package/dist/sessions/relay.js +156 -11
  120. package/dist/sessions/relay.js.map +1 -1
  121. package/dist/sessions/service.d.ts +152 -8
  122. package/dist/sessions/service.js +640 -72
  123. package/dist/sessions/service.js.map +1 -1
  124. package/dist/sessions/session.d.ts +17 -1
  125. package/dist/sessions/session.js +63 -4
  126. package/dist/sessions/session.js.map +1 -1
  127. package/dist/sessions/state-db-worker.d.ts +1 -0
  128. package/dist/sessions/state-db-worker.js +33 -0
  129. package/dist/sessions/state-db-worker.js.map +1 -0
  130. package/dist/sessions/state-db.d.ts +87 -4
  131. package/dist/sessions/state-db.js +417 -8
  132. package/dist/sessions/state-db.js.map +1 -1
  133. package/dist/sessions/store.d.ts +7 -0
  134. package/dist/sessions/store.js +36 -22
  135. package/dist/sessions/store.js.map +1 -1
  136. package/dist/sessions/streams.d.ts +10 -0
  137. package/dist/sessions/streams.js +14 -3
  138. package/dist/sessions/streams.js.map +1 -1
  139. package/dist/sessions/titles.d.ts +2 -0
  140. package/dist/sessions/titles.js +4 -0
  141. package/dist/sessions/titles.js.map +1 -1
  142. package/dist/sessions/todo.d.ts +6 -1
  143. package/dist/sessions/todo.js +11 -4
  144. package/dist/sessions/todo.js.map +1 -1
  145. package/dist/sessions/tool-display.d.ts +12 -1
  146. package/dist/sessions/tool-display.js +50 -1
  147. package/dist/sessions/tool-display.js.map +1 -1
  148. package/dist/sessions/turn-context.d.ts +1 -1
  149. package/dist/sessions/turn-context.js +11 -7
  150. package/dist/sessions/turn-context.js.map +1 -1
  151. package/dist/sessions/turn.d.ts +67 -11
  152. package/dist/sessions/turn.js +413 -111
  153. package/dist/sessions/turn.js.map +1 -1
  154. package/dist/sessions/wakeup-pause.d.ts +59 -0
  155. package/dist/sessions/wakeup-pause.js +181 -0
  156. package/dist/sessions/wakeup-pause.js.map +1 -0
  157. package/dist/settings.d.ts +20 -2
  158. package/dist/settings.js +45 -9
  159. package/dist/settings.js.map +1 -1
  160. package/dist/sidecar/fake.d.ts +4 -4
  161. package/dist/sidecar/fake.js +5 -2
  162. package/dist/sidecar/fake.js.map +1 -1
  163. package/dist/spa.js +2 -1
  164. package/dist/spa.js.map +1 -1
  165. package/dist/startup.d.ts +13 -5
  166. package/dist/startup.js +48 -0
  167. package/dist/startup.js.map +1 -1
  168. package/dist/test/harness.js +2 -0
  169. package/dist/test/harness.js.map +1 -1
  170. package/dist/test/ts-worker-hooks.d.ts +1 -0
  171. package/dist/test/ts-worker-hooks.js +24 -0
  172. package/dist/test/ts-worker-hooks.js.map +1 -0
  173. package/dist/text/diff.d.ts +9 -14
  174. package/dist/text/diff.js +74 -108
  175. package/dist/text/diff.js.map +1 -1
  176. package/dist/tools/crons.js +45 -8
  177. package/dist/tools/crons.js.map +1 -1
  178. package/dist/tools/dashboard-plugins.d.ts +53 -0
  179. package/dist/tools/dashboard-plugins.js +188 -0
  180. package/dist/tools/dashboard-plugins.js.map +1 -0
  181. package/dist/tools/extensions.d.ts +13 -1
  182. package/dist/tools/extensions.js +132 -60
  183. package/dist/tools/extensions.js.map +1 -1
  184. package/dist/tools/health.d.ts +32 -0
  185. package/dist/tools/health.js +111 -19
  186. package/dist/tools/health.js.map +1 -1
  187. package/dist/tools/insights.d.ts +8 -2
  188. package/dist/tools/insights.js +18 -2
  189. package/dist/tools/insights.js.map +1 -1
  190. package/dist/tools/kanban.d.ts +41 -1
  191. package/dist/tools/kanban.js +113 -2
  192. package/dist/tools/kanban.js.map +1 -1
  193. package/dist/tools/mcp.d.ts +15 -1
  194. package/dist/tools/mcp.js +99 -5
  195. package/dist/tools/mcp.js.map +1 -1
  196. package/dist/tools/project-os.d.ts +11 -0
  197. package/dist/tools/project-os.js +267 -0
  198. package/dist/tools/project-os.js.map +1 -0
  199. package/dist/tools/skills.d.ts +5 -1
  200. package/dist/tools/skills.js +5 -3
  201. package/dist/tools/skills.js.map +1 -1
  202. package/dist/tools/terminal.d.ts +1 -0
  203. package/dist/tools/terminal.js +1 -1
  204. package/dist/tools/terminal.js.map +1 -1
  205. package/dist/tools/updates.d.ts +33 -8
  206. package/dist/tools/updates.js +236 -57
  207. package/dist/tools/updates.js.map +1 -1
  208. package/dist/tools/wiki.d.ts +68 -0
  209. package/dist/tools/wiki.js +413 -0
  210. package/dist/tools/wiki.js.map +1 -0
  211. package/dist/workspace/escape.d.ts +61 -0
  212. package/dist/workspace/escape.js +149 -0
  213. package/dist/workspace/escape.js.map +1 -0
  214. package/dist/workspace/extract.d.ts +22 -0
  215. package/dist/workspace/extract.js +308 -0
  216. package/dist/workspace/extract.js.map +1 -0
  217. package/dist/workspace/fs.d.ts +19 -3
  218. package/dist/workspace/fs.js +96 -23
  219. package/dist/workspace/fs.js.map +1 -1
  220. package/dist/workspace/git.d.ts +18 -0
  221. package/dist/workspace/git.js +38 -25
  222. package/dist/workspace/git.js.map +1 -1
  223. package/dist/workspace/media.d.ts +4 -4
  224. package/dist/workspace/media.js +18 -45
  225. package/dist/workspace/media.js.map +1 -1
  226. package/dist/workspace/preview.d.ts +28 -0
  227. package/dist/workspace/preview.js +110 -0
  228. package/dist/workspace/preview.js.map +1 -0
  229. package/dist/workspace/rollback.d.ts +36 -21
  230. package/dist/workspace/rollback.js +179 -270
  231. package/dist/workspace/rollback.js.map +1 -1
  232. package/dist/workspace/unzip.js +4 -1
  233. package/dist/workspace/unzip.js.map +1 -1
  234. package/dist/workspace/upload.d.ts +9 -4
  235. package/dist/workspace/upload.js +9 -3
  236. package/dist/workspace/upload.js.map +1 -1
  237. package/dist/workspace/worktrees.d.ts +2 -1
  238. package/dist/workspace/worktrees.js +14 -15
  239. package/dist/workspace/worktrees.js.map +1 -1
  240. package/package.json +4 -2
  241. package/sidecar/agent_dependency.json +4 -4
  242. package/sidecar/scripts/replay_sidecar.py +25 -1
  243. package/sidecar/talaria_sidecar/__init__.py +1 -1
  244. package/sidecar/talaria_sidecar/__main__.py +7 -1
  245. package/sidecar/talaria_sidecar/home.py +52 -2
  246. package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
  247. package/sidecar/talaria_sidecar/methods/aux.py +39 -5
  248. package/sidecar/talaria_sidecar/methods/chat.py +431 -43
  249. package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
  250. package/sidecar/talaria_sidecar/methods/commands.py +96 -2
  251. package/sidecar/talaria_sidecar/methods/cron.py +39 -8
  252. package/sidecar/talaria_sidecar/methods/gateway.py +32 -15
  253. package/sidecar/talaria_sidecar/methods/kanban.py +140 -19
  254. package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
  255. package/sidecar/talaria_sidecar/methods/process.py +115 -2
  256. package/sidecar/talaria_sidecar/methods/profiles.py +84 -8
  257. package/sidecar/talaria_sidecar/methods/providers.py +27 -8
  258. package/sidecar/talaria_sidecar/methods/runtime.py +3 -0
  259. package/sidecar/talaria_sidecar/methods/state_db.py +39 -5
  260. package/sidecar/talaria_sidecar/methods/text.py +17 -1
  261. package/sidecar/talaria_sidecar/methods/usage.py +257 -4
  262. package/sidecar/talaria_sidecar/runtime.py +17 -1
  263. package/static/dist/FILES.txt +127 -125
  264. package/static/dist/assets/AppShell-g3bkgnvt.js +1 -0
  265. package/static/dist/assets/ChatPage-oo7bdan6.js +25 -0
  266. package/static/dist/assets/Dialog-g355qxhp.js +1 -0
  267. package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +1 -0
  268. package/static/dist/assets/HubRoute-lmkrbw47.js +2 -0
  269. package/static/dist/assets/{Markdown-jqrx5es0.js → Markdown-j4kut4j2.js} +125 -125
  270. package/static/dist/assets/RightPanel-ohlsdzfl.js +1 -0
  271. package/static/dist/assets/Select-kddq75qc.js +1 -0
  272. package/static/dist/assets/SessionListPanel-lu3oy0hw.js +1 -0
  273. package/static/dist/assets/SettingsLayout-o9bv4mgb.js +1 -0
  274. package/static/dist/assets/States-eq6fe29m.js +1 -0
  275. package/static/dist/assets/Toaster-pc247u9f.js +1 -0
  276. package/static/dist/assets/_app-f8n1i0m1.js +1 -0
  277. package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +1 -0
  278. package/static/dist/assets/_app.index-bzzv80hk.js +1 -0
  279. package/static/dist/assets/_app.insights-dzixbryi.js +1 -0
  280. package/static/dist/assets/_app.kanban-c6hep2us.js +1 -0
  281. package/static/dist/assets/_app.logs-i69qds98.js +1 -0
  282. package/static/dist/assets/_app.memory-kl4vf0gd.js +1 -0
  283. package/static/dist/assets/_app.profiles-b8zinmyp.js +1 -0
  284. package/static/dist/assets/{_app.session._sessionId-hh27wwu2.js → _app.session._sessionId-fn1bhde6.js} +1 -1
  285. package/static/dist/assets/_app.settings-cg8plwmf.js +1 -0
  286. package/static/dist/assets/_app.settings._section-bkwbi9zn.js +3 -0
  287. package/static/dist/assets/_app.skills-cs47sbvs.js +1 -0
  288. package/static/dist/assets/_app.tasks-dwvk64tc.js +1 -0
  289. package/static/dist/assets/_app.todos-c8xjm8p3.js +1 -0
  290. package/static/dist/assets/_app.workspaces-ehvd1gds.js +1 -0
  291. package/static/dist/assets/{abnfDiagram-VCTEODGH-oity9y4o.js → abnfDiagram-VCTEODGH-c8kdixke.js} +1 -1
  292. package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +1 -0
  293. package/static/dist/assets/{architectureDiagram-5GKGNRK7-ceaepnyr.js → architectureDiagram-5GKGNRK7-cku06x1p.js} +1 -1
  294. package/static/dist/assets/{back-eu64w89w.js → back-h7aun7ew.js} +1 -1
  295. package/static/dist/assets/{blockDiagram-I7D4REHJ-n79st4pj.js → blockDiagram-I7D4REHJ-jzthp1wa.js} +1 -1
  296. package/static/dist/assets/{c4Diagram-7LVT6UL2-mi73akzk.js → c4Diagram-7LVT6UL2-mwr67mt8.js} +1 -1
  297. package/static/dist/assets/{cancel-mzvkdjg8.js → cancel-fhi0vcnu.js} +1 -1
  298. package/static/dist/assets/channel-b2zo73z1.js +1 -0
  299. package/static/dist/assets/{chunk-4HAMMTFA-laat0g1q.js → chunk-4HAMMTFA-gpq1y228.js} +1 -1
  300. package/static/dist/assets/{chunk-75Z2AOVW-0psy1tr2.js → chunk-75Z2AOVW-ktje58c4.js} +1 -1
  301. package/static/dist/assets/{chunk-DU6HZSFF-lw8uox8x.js → chunk-DU6HZSFF-ofajdixh.js} +3 -3
  302. package/static/dist/assets/{chunk-F27PBJKO-erassib3.js → chunk-F27PBJKO-cmev85ti.js} +1 -1
  303. package/static/dist/assets/{chunk-GMAD6QVW-fz7rx619.js → chunk-GMAD6QVW-htjgt22y.js} +1 -1
  304. package/static/dist/assets/{chunk-GVQU2GXP-gdb0epb2.js → chunk-GVQU2GXP-qndvoxl7.js} +1 -1
  305. package/static/dist/assets/{chunk-IMKFNOWR-ea8t26qw.js → chunk-IMKFNOWR-e5bkd5q6.js} +1 -1
  306. package/static/dist/assets/{chunk-L3NEJ4N5-mb1gu9kz.js → chunk-L3NEJ4N5-mj1155r6.js} +1 -1
  307. package/static/dist/assets/{chunk-OSK3NFVY-eovmccvy.js → chunk-OSK3NFVY-e7gkikcw.js} +1 -1
  308. package/static/dist/assets/{chunk-P2QGCYS3-bo55zjo5.js → chunk-P2QGCYS3-f7t54xfm.js} +1 -1
  309. package/static/dist/assets/{chunk-POPQ4Y6H-ja7ohe4h.js → chunk-POPQ4Y6H-i927v9oa.js} +1 -1
  310. package/static/dist/assets/{chunk-PWAF6VOD-e30g9nus.js → chunk-PWAF6VOD-m84lmnyt.js} +1 -1
  311. package/static/dist/assets/{chunk-SHT3W25Y-gbb798f7.js → chunk-SHT3W25Y-mi0tlcu9.js} +1 -1
  312. package/static/dist/assets/{chunk-SVP7TREG-h2iw8urm.js → chunk-SVP7TREG-dnau702j.js} +1 -1
  313. package/static/dist/assets/{chunk-TICWLB2K-fd2cottz.js → chunk-TICWLB2K-edem1gkg.js} +1 -1
  314. package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +1 -0
  315. package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +1 -0
  316. package/static/dist/assets/{copied-h65fc3cx.js → copied-hcplv46p.js} +1 -1
  317. package/static/dist/assets/copy-magtofyp.js +1 -0
  318. package/static/dist/assets/{cynefin-OW5HDTMX-lbltyl5j.js → cynefin-OW5HDTMX-siqlulkl.js} +1 -1
  319. package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-lxhsqq4a.js → cynefinDiagram-5FMLGOSQ-i648tah9.js} +1 -1
  320. package/static/dist/assets/{dagre-GXQ25YYZ-gn4nnaln.js → dagre-GXQ25YYZ-mwn6uc17.js} +1 -1
  321. package/static/dist/assets/{diagram-S7CK7UJ4-pa3ij6q7.js → diagram-S7CK7UJ4-l8abxaes.js} +1 -1
  322. package/static/dist/assets/{diagram-UQ7AKVKN-zbipyz57.js → diagram-UQ7AKVKN-mekq7zgq.js} +1 -1
  323. package/static/dist/assets/{diagram-VSXAHHWV-d1kbpzgf.js → diagram-VSXAHHWV-fnky6lvc.js} +1 -1
  324. package/static/dist/assets/{diagram-VX7I27RA-i3ty14xl.js → diagram-VX7I27RA-xe6r5qfw.js} +1 -1
  325. package/static/dist/assets/{diagram-Z3DM3KII-m8xefqa7.js → diagram-Z3DM3KII-nq07dg7k.js} +1 -1
  326. package/static/dist/assets/{ebnfDiagram-PWID7BFC-nz7wj05l.js → ebnfDiagram-PWID7BFC-c62ipm3g.js} +1 -1
  327. package/static/dist/assets/endpoints-klbxod4t.js +64 -0
  328. package/static/dist/assets/{erDiagram-RLTQ6QDP-fa41ib83.js → erDiagram-RLTQ6QDP-h39kmnzy.js} +1 -1
  329. package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +1 -0
  330. package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +1 -0
  331. package/static/dist/assets/{ganttDiagram-EL5Y4UJY-n7zq01qu.js → ganttDiagram-EL5Y4UJY-ngbsyp37.js} +1 -1
  332. package/static/dist/assets/{gitGraph-4MIJSDKK-c89emb07.js → gitGraph-4MIJSDKK-fr2i7caa.js} +1 -1
  333. package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-cz7cgr6w.js → gitGraphDiagram-WWUBYQGX-eravdti4.js} +1 -1
  334. package/static/dist/assets/{highlighted-body-KPVGNVTW-d9bapmni.js → highlighted-body-KPVGNVTW-jwpop9p8.js} +1 -1
  335. package/static/dist/assets/host-i828xuo7.js +1 -0
  336. package/static/dist/assets/index-eh8zilnv.css +2 -0
  337. package/static/dist/assets/index-r648f4o1.js +11 -0
  338. package/static/dist/assets/{info-A6RAGUB7-ndddhhhh.js → info-A6RAGUB7-h11x0dxo.js} +1 -1
  339. package/static/dist/assets/{infoDiagram-27XIBGKW-ccxigcpf.js → infoDiagram-27XIBGKW-dfh47dw9.js} +1 -1
  340. package/static/dist/assets/{ishikawaDiagram-5VMMS53U-le0z9vtc.js → ishikawaDiagram-5VMMS53U-i6ypq351.js} +1 -1
  341. package/static/dist/assets/{journeyDiagram-3NMN7TZE-ivsmb26o.js → journeyDiagram-3NMN7TZE-lduf1z95.js} +1 -1
  342. package/static/dist/assets/{kanban-definition-UXKFOSKX-h6n2awt0.js → kanban-definition-UXKFOSKX-e18bu4pg.js} +1 -1
  343. package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +1 -0
  344. package/static/dist/assets/{line-dmzlfe0u.js → line-meizqsvn.js} +1 -1
  345. package/static/dist/assets/link-oot2yn73.js +1 -0
  346. package/static/dist/assets/login-gu28l9ou.js +1 -0
  347. package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +1 -0
  348. package/static/dist/assets/{mermaid-parser.core-gwyd5bnq.js → mermaid-parser.core-ntne45i9.js} +3 -3
  349. package/static/dist/assets/{mindmap-definition-YA3MSWOX-l68gg5h7.js → mindmap-definition-YA3MSWOX-27b26eok.js} +1 -1
  350. package/static/dist/assets/onboarding-lkphzu1s.js +1 -0
  351. package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +1 -0
  352. package/static/dist/assets/{packet-AYTQ26CC-gpv06065.js → packet-AYTQ26CC-l6jdka8p.js} +1 -1
  353. package/static/dist/assets/{pegDiagram-XKGWAZYB-e52vs23u.js → pegDiagram-XKGWAZYB-g1er3bxj.js} +1 -1
  354. package/static/dist/assets/{pie-WAS4IAKB-l6m7nz5s.js → pie-WAS4IAKB-i0ylcrt9.js} +1 -1
  355. package/static/dist/assets/{pieDiagram-E7YTZNPT-b4is36bq.js → pieDiagram-E7YTZNPT-fbz1e55z.js} +1 -1
  356. package/static/dist/assets/{quadrantDiagram-AXDQQJYC-m8vt2788.js → quadrantDiagram-AXDQQJYC-hhue7d8o.js} +1 -1
  357. package/static/dist/assets/{radar-RG4KPBEZ-nxbrhiov.js → radar-RG4KPBEZ-f9b70aa4.js} +1 -1
  358. package/static/dist/assets/{railroad-74A4TZTK-222mu9hi.js → railroad-74A4TZTK-lgsuoeda.js} +1 -1
  359. package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +1 -0
  360. package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +1 -0
  361. package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +1 -0
  362. package/static/dist/assets/{railroadDiagram-O6MQD6OU-o8lldfzv.js → railroadDiagram-O6MQD6OU-eqpy9fnz.js} +1 -1
  363. package/static/dist/assets/refresh-abtu93ke.js +1 -0
  364. package/static/dist/assets/refresh-cw-hlwb02qv.js +1 -0
  365. package/static/dist/assets/{requirementDiagram-BXWQKSXE-ovyq38kv.js → requirementDiagram-BXWQKSXE-ogf6puhi.js} +1 -1
  366. package/static/dist/assets/{sankeyDiagram-P5KCCOFB-ou7lznor.js → sankeyDiagram-P5KCCOFB-fqb8xcjf.js} +1 -1
  367. package/static/dist/assets/{saved-bazmcup9.js → saved-girnabkf.js} +1 -1
  368. package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-ovckdzf2.js → sequenceDiagram-WJ2MYXX4-dlcz6qjz.js} +1 -1
  369. package/static/dist/assets/{settings_section_extensions_title-ertwwhlx.js → settings_section_extensions_title-h14cwk6f.js} +1 -1
  370. package/static/dist/assets/share._token-kl0r7ido.js +2 -0
  371. package/static/dist/assets/sliders-horizontal-n1zm34qq.js +1 -0
  372. package/static/dist/assets/sse-iwku0sjo.js +1 -0
  373. package/static/dist/assets/{stateDiagram-D77RDMKH-fcrexkkv.js → stateDiagram-D77RDMKH-fyoznpcs.js} +1 -1
  374. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +1 -0
  375. package/static/dist/assets/{swimlanes-42K2YHIH-f7usu8fw.js → swimlanes-42K2YHIH-oefldhfy.js} +1 -1
  376. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +8 -0
  377. package/static/dist/assets/{timeline-definition-24CTP7MA-gp1hvz9f.js → timeline-definition-24CTP7MA-b1vl2zil.js} +1 -1
  378. package/static/dist/assets/todoStore-jjr5yr78.js +1 -0
  379. package/static/dist/assets/{treeView-Q6P3EWNA-gb9gf11u.js → treeView-Q6P3EWNA-f7hcci5o.js} +1 -1
  380. package/static/dist/assets/{treemap-WGGIJYW6-nuvfnvvi.js → treemap-WGGIJYW6-nl85071a.js} +1 -1
  381. package/static/dist/assets/units-kgxzxfhi.js +1 -0
  382. package/static/dist/assets/{untitled-htelhc68.js → untitled-cikfjntn.js} +1 -1
  383. package/static/dist/assets/{useForm-h2t0u14e.js → useForm-kqoqg0k9.js} +1 -1
  384. package/static/dist/assets/useLocale-o59tbiea.js +1 -0
  385. package/static/dist/assets/{useParams-dqd64jv7.js → useParams-b4dq6n4q.js} +1 -1
  386. package/static/dist/assets/{useSearch-j30pvsy7.js → useSearch-ipfmv3he.js} +1 -1
  387. package/static/dist/assets/{vennDiagram-4TSXK5OY-fzchbzaj.js → vennDiagram-4TSXK5OY-h5hzbk0n.js} +1 -1
  388. package/static/dist/assets/{wardley-WFR3VGLG-m47mhfbh.js → wardley-WFR3VGLG-jftvpm3e.js} +1 -1
  389. package/static/dist/assets/{wardleyDiagram-VM6X3IG4-odg6ct1z.js → wardleyDiagram-VM6X3IG4-hedh85ge.js} +1 -1
  390. package/static/dist/assets/{xychartDiagram-S5SC5T6Z-mrhms5um.js → xychartDiagram-S5SC5T6Z-e49523ab.js} +1 -1
  391. package/static/dist/index.html +1 -1
  392. package/static/dist/sw.js +2 -2
  393. package/static/dist/assets/AppShell-ef3bhu32.js +0 -1
  394. package/static/dist/assets/Button-nx37f4u1.js +0 -1
  395. package/static/dist/assets/ChatPage-cdcpykcg.js +0 -25
  396. package/static/dist/assets/Dialog-mec42hvb.js +0 -1
  397. package/static/dist/assets/HubRoute-ecb65zpr.js +0 -2
  398. package/static/dist/assets/RightPanel-d1lgvk4s.js +0 -1
  399. package/static/dist/assets/Select-h4ivl9qf.js +0 -1
  400. package/static/dist/assets/SessionListPanel-ewib046b.js +0 -1
  401. package/static/dist/assets/SettingsLayout-lx654cup.js +0 -1
  402. package/static/dist/assets/States-ehsb6lzo.js +0 -1
  403. package/static/dist/assets/Toaster-mch1pa3t.js +0 -1
  404. package/static/dist/assets/_app-m8d961ef.js +0 -1
  405. package/static/dist/assets/_app.ext._extensionId-mp33hbzi.js +0 -1
  406. package/static/dist/assets/_app.index-dk6zp7e0.js +0 -1
  407. package/static/dist/assets/_app.insights-jt2fk4i1.js +0 -1
  408. package/static/dist/assets/_app.kanban-if4pubeu.js +0 -1
  409. package/static/dist/assets/_app.logs-mfaw9m6g.js +0 -1
  410. package/static/dist/assets/_app.memory-h3eaarb6.js +0 -1
  411. package/static/dist/assets/_app.profiles-ienktovs.js +0 -1
  412. package/static/dist/assets/_app.settings-dpoe0bzf.js +0 -1
  413. package/static/dist/assets/_app.settings._section-l468ynag.js +0 -3
  414. package/static/dist/assets/_app.skills-kcbncc8i.js +0 -1
  415. package/static/dist/assets/_app.tasks-occdrqhw.js +0 -2
  416. package/static/dist/assets/_app.todos-nnke2rcc.js +0 -1
  417. package/static/dist/assets/_app.workspaces-cdlatvwj.js +0 -1
  418. package/static/dist/assets/architecture-7GRP2DOG-hj11333z.js +0 -1
  419. package/static/dist/assets/channel-mbvmf2vv.js +0 -1
  420. package/static/dist/assets/classDiagram-ZZMXUADV-o8r05k0n.js +0 -1
  421. package/static/dist/assets/classDiagram-v2-VYDZK3BY-o8r05k0n.js +0 -1
  422. package/static/dist/assets/copy-e6977uwq.js +0 -1
  423. package/static/dist/assets/endpoints-k7yf25m0.js +0 -64
  424. package/static/dist/assets/eventmodeling-NTZA5JFV-kpbq09bx.js +0 -1
  425. package/static/dist/assets/flowDiagram-HODETNUW-lcz0kx14.js +0 -1
  426. package/static/dist/assets/index-h00usru2.js +0 -11
  427. package/static/dist/assets/index-n73ijkv2.css +0 -2
  428. package/static/dist/assets/lazyRouteComponent-m1rtyk4t.js +0 -1
  429. package/static/dist/assets/link-budeg5t9.js +0 -1
  430. package/static/dist/assets/login-kjhasvp8.js +0 -1
  431. package/static/dist/assets/matchContext-f8oy3lo7.js +0 -1
  432. package/static/dist/assets/mermaid-HWGCJPDP-jb5d211j.js +0 -1
  433. package/static/dist/assets/onboarding-cdfrk0pj.js +0 -1
  434. package/static/dist/assets/railroad-abnf-HS5TGJTU-kdvgl6x8.js +0 -1
  435. package/static/dist/assets/railroad-ebnf-LZEXJU2U-itiqslby.js +0 -1
  436. package/static/dist/assets/railroad-peg-WCYAUIDC-go7kov78.js +0 -1
  437. package/static/dist/assets/refresh-cw-kbcje1uy.js +0 -1
  438. package/static/dist/assets/search-jen74z4u.js +0 -1
  439. package/static/dist/assets/share._token-dan9hgvj.js +0 -2
  440. package/static/dist/assets/sliders-horizontal-f9cb3lh3.js +0 -1
  441. package/static/dist/assets/stateDiagram-v2-MP3YSRHH-lcfraua2.js +0 -1
  442. package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ogmanni0.js +0 -8
  443. package/static/dist/assets/todoStore-eqtid4r4.js +0 -1
  444. package/static/dist/assets/useLocale-hcsb84pj.js +0 -1
  445. package/static/dist/assets/useNavigate-nwy70ztj.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raster-image.js","sourceRoot":"","sources":["../src/raster-image.ts"],"names":[],"mappings":"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"}
package/dist/redact.d.ts CHANGED
@@ -33,6 +33,7 @@ export declare function publicToolFrame(data: Record<string, unknown>, enabled:
33
33
  export declare function completedToolIndex(calls: readonly Record<string, unknown>[], tid: string, name: unknown): number;
34
34
  /** A tool frame carrying its public call `id` in place of the sidecar-internal `tid`. */
35
35
  export declare function withToolId(data: Record<string, unknown>, id: string): Record<string, unknown>;
36
+ export declare function redactNestedMessageContainers(value: unknown, enabled: boolean): unknown;
36
37
  /** Redact credentials in a public session response without mutation (Python `redact_session_data`). */
37
38
  export declare function redactSessionData(session: Record<string, unknown>, enabled: boolean): Record<string, unknown>;
38
39
  export declare const publicSessionProjection: typeof redactSessionData;
package/dist/redact.js CHANGED
@@ -1,5 +1,9 @@
1
1
  import { str } from './util.js';
2
+ import { diffHunks } from './text/diff.js';
3
+ import { isRasterDataUri } from './raster-image.js';
2
4
  import { snapshotArgs, toolArgs, toolDisplay, toolName } from './sessions/tool-display.js';
5
+ import { messageText } from './sessions/merge.js';
6
+ import { stripAttachedFilesMarker } from './sessions/session.js';
3
7
  /**
4
8
  * Credential redaction and the public session projection (Python
5
9
  * `api/helpers.py`). API responses are a hard boundary: transcript-bearing
@@ -211,8 +215,11 @@ const USER_FLAG_RE = /(?<![A-Za-z0-9-])(?:-[uU][ \t]*|--(?:user|proxy-u(?:s(?:e(
211
215
  /** The prefilter's view of `USER_FLAG_RE`. */
212
216
  const USER_FLAG_TEST_RE = new RegExp(USER_FLAG_RE.source);
213
217
  const QUERY_KEY_RE = /([?&]key=)([^\s"'&#]+)/gi;
214
- /** A Telegram bot token (`bot<id>:<secret>`): the id stays. */
215
- const TELEGRAM_TOKEN_RE = /(bot)?(\d{8,}):([-A-Za-z0-9_]{30,})/g;
218
+ /**
219
+ * A Telegram bot token (`bot<id>:<secret>`): the id stays. The id starts a digit run, so a long number is scanned once
220
+ * rather than from every digit (a match from mid-run would end at the same `:`).
221
+ */
222
+ const TELEGRAM_TOKEN_RE = /(bot)?(?<!\d)(\d{8,}):([-A-Za-z0-9_]{30,})/g;
216
223
  /** An E.164 phone number, masked to its first and last digits; never inside a word or encoded data (`ab+1234567`). */
217
224
  const PHONE_RE = /(?<![A-Za-z0-9])\+[1-9]\d{6,14}(?![A-Za-z0-9])/g;
218
225
  /**
@@ -253,39 +260,56 @@ const ANSI_PAYLOAD_GAPS_RE = new RegExp([SEQ_CSI, String.raw `${SEQ_ESC}[\]PX^_]
253
260
  * terminal title can hold a token), and without control characters only (an escape's final byte can be a token's).
254
261
  */
255
262
  const SPLIT_VIEWS = [ANSI_GAPS_RE, ANSI_PAYLOAD_GAPS_RE, CONTROL_CHARS_RE];
263
+ /** `ANSI_GAPS_RE` without the whitespace controls, so a view keeps its lines and words apart. */
264
+ const DISPLAY_GAPS_RE = new RegExp(String.raw `(?![\t-\r])(?:${ANSI_GAPS_RE.source})`, 'g');
256
265
  const ANSI_GAP_AT_RE = new RegExp(ANSI_GAPS_RE.source, 'y');
257
266
  const TOKEN_CHAR_RE = /[A-Za-z0-9_-]/;
267
+ /** A character a credential's prefix or body can hold (`SG.`, `glrt-a.b`, `gAAAA…=`): what a fail-closed run walks. */
268
+ const RUN_CHAR_RE = /[A-Za-z0-9_.=-]/;
258
269
  /** A string sequence's opener, with an OSC's command number (`8;`), which is no payload. */
259
270
  const STRING_OPENER_RE = new RegExp(String.raw `^(?:(?:${SEQ_ESC}\]|\x9d)(?:\d*;)?|${SEQ_ESC}[PX^_]|[\x90\x98\x9e\x9f])`);
260
271
  const PAYLOAD_RUN_CAP = 65_536;
261
- const CRED_TEST_RE = new RegExp(CRED_RE.source);
272
+ /**
273
+ * The token families a split token is joined for, each with its own boundaries: `CRED_RE`'s prefixes, and `JWT_RE`, whose
274
+ * `\b` lets a JWT start after a `-` and which has no right boundary.
275
+ */
276
+ const TOKEN_TEST_RE = new RegExp(`${CRED_RE.source}|${JWT_RE.source}`);
262
277
  /** `CRED_RE`'s prefix and body from a position, without its boundaries (a split token checks the original ones). */
263
278
  const CRED_RUN_RE = new RegExp(CRED_RE.source.replace(/^\(\?<!\[A-Za-z0-9_-\]\)/, '').replace(/\(\?!\[A-Za-z0-9_-\]\)$/, ''), 'y');
279
+ const JWT_RUN_SOURCE = JWT_RE.source.replace(/^\\b/, '');
280
+ /** A credential's or JWT's prefix and body from a position, without its boundaries. */
281
+ const TOKEN_RUN_RE = new RegExp(`${CRED_RUN_RE.source}|${JWT_RUN_SOURCE}`, 'y');
264
282
  const SPLIT_TOKEN_CAP = 1024;
265
283
  /** Where a `CRED_RE` prefix and body start at a boundary, however they end. */
266
284
  const CRED_START_RE = new RegExp(CRED_RE.source.replace(/\(\?!\[A-Za-z0-9_-\]\)$/, ''), 'g');
267
- const CRED_WHOLE_RE = new RegExp(`^${CRED_RE.source}$`);
268
- /** `CRED_START_RE` and `CRED_RUN_RE` without their body: a credential's prefix, however little of its body follows. */
269
- const CRED_PREFIX_RE = new RegExp(CRED_START_RE.source.replace(/\{\d+,?\}/g, '{0}'), 'g');
270
- const CRED_PREFIX_RUN_RE = new RegExp(CRED_RUN_RE.source.replace(/\{\d+,?\}/g, '{0}'), 'y');
285
+ const TOKEN_START_RE = new RegExp(`${CRED_START_RE.source}|${JWT_RE.source}`, 'g');
286
+ const TOKEN_WHOLE_RE = new RegExp(`^(?:${CRED_RE.source}|${JWT_RE.source})$`);
287
+ /** `TOKEN_START_RE` and `TOKEN_RUN_RE` without their body: a token's prefix, however little of its body follows. */
288
+ const TOKEN_PREFIX_RE = new RegExp(`${CRED_START_RE.source.replace(/\{\d+,?\}/g, '{0}')}|\\beyJ`, 'g');
289
+ const TOKEN_PREFIX_RUN_RE = new RegExp(`${CRED_RUN_RE.source.replace(/\{\d+,?\}/g, '{0}')}|eyJ`, 'y');
271
290
  /** A URL query parameter's value, up to the next `&` or `#`. */
272
291
  const QUERY_VALUE_RE = /[^&#]*/y;
273
- const PRIVKEY_RE = /-----BEGIN[A-Z ]*PRIVATE KEY-----[\s\S]*?-----END[A-Z ]*PRIVATE KEY-----/g;
274
- /** A private key whose end marker is missing (a display cap cut it off): masked to the end of the text. */
275
- const PRIVKEY_OPEN_RE = /-----BEGIN[A-Z ]*PRIVATE KEY-----[\s\S]*$/;
292
+ const PEM_OPENER = '-----BEGIN';
293
+ /**
294
+ * A private key through its end marker (captured) or, when that is missing (a display cap cut it off), to the end of the
295
+ * text.
296
+ */
297
+ const PRIVKEY_RE = /-----BEGIN[A-Z ]*PRIVATE KEY-----(?:[\s\S]*?(-----END[A-Z ]*PRIVATE KEY-----)|[\s\S]*$)/g;
298
+ /** `PRIVKEY_RE` after its opener, from a position. */
299
+ const PRIVKEY_REST_RE = new RegExp(PRIVKEY_RE.source.slice(PEM_OPENER.length), 'y');
276
300
  const CODE_ENV_KEY_LITERAL_RE = /([A-Z0-9_]{0,50}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|AUTH)[A-Z0-9_]{0,50}=)(["'][)\]:,]+|[)\]:,]+)/y;
277
301
  const ENV_KEY_PREFIX_RE = /([A-Z0-9_]{0,50}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|AUTH)[A-Z0-9_]{0,50}=)/g;
278
302
  const REDACTED_ENV_VALUE_RE = /(?:\*{3,}|[A-Za-z0-9][A-Za-z0-9_.:/+-]{0,32}\.\.\.[A-Za-z0-9_.:/+-]{1,16})/y;
279
303
  /**
280
- * Where a credential split by control or zero-width characters (`ghp_abc\x1bdef`, `ghp_abc\ndef…`) starting at `i` of the
304
+ * Where a credential or JWT split by control or zero-width characters (`ghp_abc\x1bdef`, `ghp_abc\ndef…`) starting at `i` of the
281
305
  * stripped text ends there, or -1. The run of its prefix and body is read once (capped), then the longest candidate is
282
- * taken that ends at a piece boundary of the original, is a whole credential, is not the name of a `KEY=` that follows,
306
+ * taken that ends at a piece boundary of the original, is a whole token, is not the name of a `KEY=` that follows,
283
307
  * and never reaches a line holding a whole token itself (that line is the prefix pass's and joins nothing).
284
308
  */
285
309
  function splitTokenEnd(text, stripped, kept, i) {
286
- CRED_RUN_RE.lastIndex = 0;
310
+ TOKEN_RUN_RE.lastIndex = 0;
287
311
  // ponytail: a split credential longer than SPLIT_TOKEN_CAP is cut at the cap; raise it if longer tokens appear.
288
- const run = CRED_RUN_RE.exec(stripped.slice(i, i + SPLIT_TOKEN_CAP))?.[0];
312
+ const run = TOKEN_RUN_RE.exec(stripped.slice(i, i + SPLIT_TOKEN_CAP))?.[0];
289
313
  if (!run)
290
314
  return -1;
291
315
  const start = kept[i];
@@ -293,7 +317,7 @@ function splitTokenEnd(text, stripped, kept, i) {
293
317
  for (let lineStart = start; lineStart < limit;) {
294
318
  const lineEnd = text.slice(lineStart, limit).search(/[\r\n]/);
295
319
  const end = lineEnd === -1 ? limit : lineStart + lineEnd;
296
- if (CRED_TEST_RE.test(text.slice(lineStart, end))) {
320
+ if (TOKEN_TEST_RE.test(text.slice(lineStart, end))) {
297
321
  limit = lineStart === start ? end : lineStart;
298
322
  break;
299
323
  }
@@ -304,23 +328,17 @@ function splitTokenEnd(text, stripped, kept, i) {
304
328
  for (let e = i + run.length; e > i; e -= 1) {
305
329
  const atBoundary = e === stripped.length || kept[e] - kept[e - 1] > 1 || (e === i + run.length && !/[A-Za-z0-9_-]/.test(stripped[e]));
306
330
  const originalEnd = kept[e - 1] + 1;
307
- if (!atBoundary || originalEnd > limit || !CRED_WHOLE_RE.test(stripped.slice(i, e)) || /^[ \t]*=/.test(text.slice(originalEnd, originalEnd + 64)))
331
+ if (!atBoundary || originalEnd > limit || !TOKEN_WHOLE_RE.test(stripped.slice(i, e)) || /^[ \t]*=/.test(text.slice(originalEnd, originalEnd + 64)))
308
332
  continue;
309
333
  return e;
310
334
  }
311
335
  return -1;
312
336
  }
313
- /**
314
- * The original spans, and the joined text, of prefixed credentials whose body a gap of one of `SPLIT_VIEWS` splits,
315
- * matched on the text without those gaps, plus `payloadRunSpan`'s from each prefix. A token starts at a boundary of the
316
- * stripped text, or where a stripped gap hid the original one (`note\nghp_…`); one starting inside a token already
317
- * masked is part of it.
318
- */
319
- function splitTokenSpans(text, gaps) {
337
+ /** The text without the gaps of `gaps`, and the original index of each kept character, or null when it has none. */
338
+ function splitView(text, gaps) {
320
339
  const stripped = text.replace(gaps, '');
321
340
  if (stripped.length === text.length)
322
- return [];
323
- // The original index of each kept character.
341
+ return null;
324
342
  const kept = [];
325
343
  let at = 0;
326
344
  for (const m of text.matchAll(gaps)) {
@@ -330,14 +348,27 @@ function splitTokenSpans(text, gaps) {
330
348
  }
331
349
  while (at < text.length)
332
350
  kept.push(at++);
333
- const starts = [...stripped.matchAll(CRED_START_RE)].map((m) => m.index);
334
- const prefixStarts = [...stripped.matchAll(CRED_PREFIX_RE)].map((m) => m.index);
351
+ return { stripped, kept };
352
+ }
353
+ /**
354
+ * The original spans, and the joined text, of prefixed credentials and JWTs whose body a gap of one of `SPLIT_VIEWS` splits,
355
+ * matched on the text without those gaps, plus `payloadRunSpan`'s from each prefix. A token starts at a boundary of the
356
+ * stripped text, or where a stripped gap hid the original one (`note\nghp_…`); one starting inside a token already
357
+ * masked is part of it.
358
+ */
359
+ function splitTokenSpans(text, gaps) {
360
+ const view = splitView(text, gaps);
361
+ if (!view)
362
+ return [];
363
+ const { stripped, kept } = view;
364
+ const starts = [...stripped.matchAll(TOKEN_START_RE)].map((m) => m.index);
365
+ const prefixStarts = [...stripped.matchAll(TOKEN_PREFIX_RE)].map((m) => m.index);
335
366
  for (let i = 1; i < kept.length; i += 1) {
336
367
  if (kept[i] - kept[i - 1] <= 1 || !TOKEN_CHAR_RE.test(stripped[i - 1]))
337
368
  continue;
338
369
  starts.push(i);
339
- CRED_PREFIX_RUN_RE.lastIndex = i;
340
- if (CRED_PREFIX_RUN_RE.test(stripped))
370
+ TOKEN_PREFIX_RUN_RE.lastIndex = i;
371
+ if (TOKEN_PREFIX_RUN_RE.test(stripped))
341
372
  prefixStarts.push(i);
342
373
  }
343
374
  const spans = [];
@@ -351,17 +382,103 @@ function splitTokenSpans(text, gaps) {
351
382
  spans.push([kept[i], kept[e - 1] + 1, stripped.slice(i, e)]);
352
383
  scanned = e;
353
384
  }
385
+ return [...spans, ...payloadRunSpans(text, prefixStarts.map((i) => kept[i]))];
386
+ }
387
+ /** `payloadRunSpan`'s spans from credential prefixes at these original indices, each run walked once. */
388
+ function payloadRunSpans(text, starts) {
389
+ const spans = [];
354
390
  let walked = 0;
355
- for (const i of prefixStarts.sort((a, b) => a - b)) {
356
- if (kept[i] < walked)
391
+ for (const start of starts.sort((a, b) => a - b)) {
392
+ if (start < walked)
357
393
  continue;
358
- const [span, reached] = payloadRunSpan(text, kept[i]);
394
+ const [span, reached] = payloadRunSpan(text, start);
359
395
  if (span)
360
396
  spans.push(span);
361
397
  walked = reached;
362
398
  }
363
399
  return spans;
364
400
  }
401
+ /** A string sequence's terminator: BEL (OSC only), ST, or CAN or SUB cancelling it. */
402
+ const STRING_END_RE = /(?:\x07|\x1b\\|\x9c|[\x18\x1a])$/;
403
+ /** Tags a candidate that can grow only into a JWT prefix: one starting after a `-`, a boundary for `JWT_RE`'s `\b` alone. */
404
+ const JWT_ONLY = '\0';
405
+ /**
406
+ * What a piece after `prev` (undefined after a gap) seeds: any prefix after a non-token character, only a JWT's after a
407
+ * `-`, none after a word character.
408
+ */
409
+ const seedAfter = (prev) => (prev === undefined || !TOKEN_CHAR_RE.test(prev) ? '' : prev === '-' ? JWT_ONLY : null);
410
+ /**
411
+ * Where a credential or JWT prefix or a private key's opener starts, where it ends, and which marker it is, when its
412
+ * pieces lie apart in a run of token characters and escape sequences, with a string payload between them taken whole or
413
+ * skipped (`g\x1b]0;x\x07h\x1b]0;p_\x07…`), so that no view holds it whole.
414
+ * Display characters are mandatory and each payload's optional. A piece starts on the display after a gap or a non-token
415
+ * character (`.`), or in a payload's trailing run after its start or a non-token character, where `payloadRunSpan` can
416
+ * walk from it; a JWT's also after a `-`.
417
+ * Candidates live only while they can grow into a prefix, which bounds them and keeps the scan linear.
418
+ */
419
+ function crossPayloadPrefixStarts(text) {
420
+ const starts = [];
421
+ if (!/[\x1b\x90\x98\x9d-\x9f]/.test(text))
422
+ return starts;
423
+ // Each candidate string, with the original index of its earliest start.
424
+ let candidates = new Map();
425
+ // Grows a candidate by the run characters of `chars`, which starts at original index `at`.
426
+ const grow = (into, candidate, start, chars, at) => {
427
+ for (let j = 0; j < chars.length; j += 1) {
428
+ if (!RUN_CHAR_RE.test(chars[j]))
429
+ continue;
430
+ candidate += chars[j];
431
+ if (PAYLOAD_MARKERS.has(candidate))
432
+ return void starts.push([start, at + j + 1, candidate]);
433
+ if (!PAYLOAD_MARKER_STEMS.has(candidate))
434
+ return;
435
+ }
436
+ const seen = into.get(candidate);
437
+ if (seen === undefined || start < seen)
438
+ into.set(candidate, start);
439
+ };
440
+ // The last display character, unless a gap came after it: what a piece starting here may seed.
441
+ let prev;
442
+ for (let k = 0; k < text.length;) {
443
+ ANSI_GAP_AT_RE.lastIndex = k;
444
+ const gap = ANSI_GAP_AT_RE.exec(text)?.[0];
445
+ if (gap) {
446
+ const from = STRING_OPENER_RE.exec(gap)?.[0].length ?? gap.length;
447
+ const next = new Map(candidates);
448
+ for (const [candidate, start] of candidates)
449
+ grow(next, candidate, start, gap.slice(from), k + from);
450
+ const end = Math.max(from, gap.length - (STRING_END_RE.exec(gap)?.[0].length ?? 0));
451
+ let tail = end;
452
+ while (tail > from && RUN_CHAR_RE.test(gap[tail - 1]))
453
+ tail -= 1;
454
+ for (let j = tail; j < end; j += 1) {
455
+ const seed = seedAfter(j === tail ? undefined : gap[j - 1]);
456
+ if (seed !== null)
457
+ grow(next, seed, k + j, gap.slice(j, end), k + j);
458
+ }
459
+ candidates = next;
460
+ prev = undefined;
461
+ k += gap.length;
462
+ }
463
+ else if (RUN_CHAR_RE.test(text[k])) {
464
+ const next = new Map();
465
+ for (const [candidate, start] of candidates)
466
+ grow(next, candidate, start, text[k], k);
467
+ const seed = seedAfter(prev);
468
+ if (seed !== null)
469
+ grow(next, seed, k, text[k], k);
470
+ candidates = next;
471
+ prev = text[k];
472
+ k += 1;
473
+ }
474
+ else {
475
+ candidates.clear();
476
+ prev = undefined;
477
+ k += 1;
478
+ }
479
+ }
480
+ return starts;
481
+ }
365
482
  /**
366
483
  * Fail-closed for a token split across string payloads: from a credential prefix at `start`, the span through the run of
367
484
  * token characters and whole escape sequences after it, when a string payload in the run holds token characters, and
@@ -380,7 +497,7 @@ function payloadRunSpan(text, start) {
380
497
  if (gap) {
381
498
  const from = STRING_OPENER_RE.exec(gap)?.[0].length ?? gap.length;
382
499
  for (let j = from; j < gap.length; j += 1) {
383
- if (!TOKEN_CHAR_RE.test(gap[j]))
500
+ if (!RUN_CHAR_RE.test(gap[j]))
384
501
  continue;
385
502
  token += gap[j];
386
503
  end = k + j + 1;
@@ -388,7 +505,7 @@ function payloadRunSpan(text, start) {
388
505
  }
389
506
  k += gap.length;
390
507
  }
391
- else if (TOKEN_CHAR_RE.test(text[k])) {
508
+ else if (RUN_CHAR_RE.test(text[k])) {
392
509
  token += text[k];
393
510
  end = k += 1;
394
511
  }
@@ -397,9 +514,51 @@ function payloadRunSpan(text, start) {
397
514
  }
398
515
  return [hidden ? [start, end, token] : null, k];
399
516
  }
517
+ /**
518
+ * The original spans of private keys a gap of one of `SPLIT_VIEWS` splits (`-----BE\x1b[1mGIN …`), matched on each view,
519
+ * and of those whose opener lies apart across string payloads (`-----B\x1b]0;x\x07E\x1b]0;GIN\x07 …`), matched on each
520
+ * view from where the opener ends. A whole key is `PRIVKEY_RE`'s on the text itself. A key one view leaves open runs to
521
+ * the end of the text only when no view closes one there (`-----END PRI\x1b[1mVATE KEY-----`).
522
+ */
523
+ function privateKeySpans(text) {
524
+ const openers = crossPayloadPrefixStarts(text).filter(([, , marker]) => marker === PEM_OPENER).sort((a, b) => a[1] - b[1]);
525
+ const closed = [];
526
+ const open = [];
527
+ for (const gaps of SPLIT_VIEWS) {
528
+ const view = splitView(text, gaps);
529
+ if (!view)
530
+ continue;
531
+ const { stripped, kept } = view;
532
+ // A key running to the end of the view runs to the end of the text, past any trailing gap.
533
+ const end = (e) => (e === stripped.length ? text.length : kept[e - 1] + 1);
534
+ for (const m of stripped.matchAll(PRIVKEY_RE))
535
+ (m[1] ? closed : open).push([kept[m.index], end(m.index + m[0].length), '']);
536
+ let i = 0;
537
+ let scanned = 0;
538
+ for (const [start, opened] of openers) {
539
+ if (opened < scanned)
540
+ continue;
541
+ while (i < kept.length && kept[i] < opened)
542
+ i += 1;
543
+ PRIVKEY_REST_RE.lastIndex = i;
544
+ const m = PRIVKEY_REST_RE.exec(stripped);
545
+ if (!m)
546
+ continue;
547
+ scanned = end(PRIVKEY_REST_RE.lastIndex);
548
+ const spans = m[1] ? closed : open;
549
+ spans.push([start, scanned, '']);
550
+ }
551
+ }
552
+ return [...closed, ...open.filter(([start]) => !closed.some(([from, to]) => from <= start && start < to))];
553
+ }
400
554
  /** Masks each union of the split-token spans every view finds, so no view masks a piece of a token another one joins. */
401
555
  function maskSplitTokens(text) {
402
- const spans = SPLIT_VIEWS.flatMap((gaps) => splitTokenSpans(text, gaps)).sort((a, b) => a[0] - b[0]);
556
+ const starts = crossPayloadPrefixStarts(text).flatMap(([start, , marker]) => (marker === PEM_OPENER ? [] : [start]));
557
+ return maskSpans(text, [...SPLIT_VIEWS.flatMap((gaps) => splitTokenSpans(text, gaps)), ...payloadRunSpans(text, starts)], mask);
558
+ }
559
+ /** Replaces each union of overlapping original spans, given the longest of their texts. */
560
+ function maskSpans(text, found, replace) {
561
+ const spans = found.sort((a, b) => a[0] - b[0]);
403
562
  let out = '';
404
563
  let last = 0;
405
564
  for (let k = 0; k < spans.length;) {
@@ -411,7 +570,7 @@ function maskSplitTokens(text) {
411
570
  if (nextToken.length > token.length)
412
571
  token = nextToken;
413
572
  }
414
- out += text.slice(last, start) + mask(token);
573
+ out += text.slice(last, start) + replace(token);
415
574
  last = end;
416
575
  }
417
576
  return out + text.slice(last);
@@ -1601,6 +1760,69 @@ function secretTokenCounts(text) {
1601
1760
  export function redactSensitive(text) {
1602
1761
  if (!text)
1603
1762
  return text;
1763
+ const redacted = redactShellText(text);
1764
+ // An escape sequence in a key or between a key and its value (`\x1b[1;31mAPI_KEY\x1b[m=…`, `pass\x1b[1mword …`) hides
1765
+ // it from the rules. A unit of the text the view without sequences masks anywhere is masked in the text's redaction,
1766
+ // wherever it still shows, removing a sequence inside one and keeping the rest.
1767
+ const stripped = text.replace(DISPLAY_GAPS_RE, '');
1768
+ if (stripped.length === text.length)
1769
+ return redacted;
1770
+ const shown = redactShellText(stripped);
1771
+ const base = unitCounts(stripped);
1772
+ const shownCounts = unitCounts(shown);
1773
+ const view = splitView(redacted, DISPLAY_GAPS_RE);
1774
+ const plain = view?.stripped ?? redacted;
1775
+ const at = (i) => (view ? view.kept[i] : i);
1776
+ const raw = unitCounts(plain);
1777
+ // Hidden by a redaction showing `counts`: fewer than the text holds, or fewer than another redaction shows (a value
1778
+ // equal to a mask made elsewhere, `ghp_ab...cdef`, fails closed). Only a unit of the text is masked, never a mask.
1779
+ const hides = (counts, other, unit) => {
1780
+ const n = counts.get(unit) ?? 0;
1781
+ return base.has(unit) && (n < base.get(unit) || n < (other.get(unit) ?? 0));
1782
+ };
1783
+ // Masked units only blanks apart are one value (`'correct horse battery'`), masked whole so its word count stays hidden.
1784
+ const spans = [];
1785
+ let last = -1;
1786
+ for (const m of plain.matchAll(MASK_OR_UNIT_RE)) {
1787
+ if (!hides(shownCounts, raw, m[0]))
1788
+ continue;
1789
+ const end = at(m.index + m[0].length - 1) + 1;
1790
+ if (last !== -1 && /^[ \t]+$/.test(plain.slice(last, m.index)))
1791
+ spans.at(-1)[1] = end;
1792
+ else
1793
+ spans.push([at(m.index), end, m[0]]);
1794
+ last = m.index + m[0].length;
1795
+ }
1796
+ const out = spans.length ? maskSpans(redacted, spans, () => '***') : redacted;
1797
+ // A credential of delimiters only (`Bear\x1b[1mer $$$$`) has no unit to mask: when the view shows fewer of a delimiter
1798
+ // than the text's redaction, the view's redaction is returned, without escape sequences, with each unit the text's
1799
+ // redaction hides masked in it too.
1800
+ const plainOut = out.replace(DISPLAY_GAPS_RE, '');
1801
+ const outCounts = delimiterCounts(plainOut);
1802
+ const viewCounts = delimiterCounts(shown);
1803
+ if (![...outCounts].some(([char, count]) => (viewCounts.get(char) ?? 0) < count))
1804
+ return out;
1805
+ const hidden = unitCounts(plainOut);
1806
+ return shown.replace(MASK_OR_UNIT_RE, (unit) => (hides(hidden, shownCounts, unit) ? '***' : unit));
1807
+ }
1808
+ const PRIVATE_KEY_MASK = '[REDACTED PRIVATE KEY]';
1809
+ /** A private key's mask, as one unit (its words are no units of their own), or a `SECRET_UNIT_RE` unit. */
1810
+ const MASK_OR_UNIT_RE = new RegExp(String.raw `\[REDACTED PRIVATE KEY\]|${SECRET_UNIT_RE.source}`, 'gu');
1811
+ /** A text's `MASK_OR_UNIT_RE` units, counted. */
1812
+ function unitCounts(text) {
1813
+ const counts = new Map();
1814
+ for (const [unit] of text.matchAll(MASK_OR_UNIT_RE))
1815
+ counts.set(unit, (counts.get(unit) ?? 0) + 1);
1816
+ return counts;
1817
+ }
1818
+ /** A text's delimiters, `SECRET_UNIT_RE`'s but whitespace, counted outside the masks `***` and a private key's. */
1819
+ function delimiterCounts(text) {
1820
+ const counts = new Map();
1821
+ for (const [char] of text.replaceAll(PRIVATE_KEY_MASK, '').replace(/(?<!\*)\*{3}(?!\*)/g, '').matchAll(/['"`$\\=:@/;&|<>(){}[\],*]/g))
1822
+ counts.set(char, (counts.get(char) ?? 0) + 1);
1823
+ return counts;
1824
+ }
1825
+ function redactShellText(text) {
1604
1826
  // Line continuations join their lines as the shell runs them (`--user \⏎ bob:pw`, `--pass\⏎word=x`): that view is
1605
1827
  // redacted, and a text with nothing to mask keeps its lines as written.
1606
1828
  const joined = text.replace(/\\\r?\n/g, '');
@@ -1778,7 +2000,7 @@ export function redactSensitive(text) {
1778
2000
  function redactRules(text) {
1779
2001
  if (!text)
1780
2002
  return text;
1781
- let out = maskSplitTokens(text).replace(CRED_RE, (_, t) => mask(t));
2003
+ let out = maskSplitTokens(maskSpans(text, privateKeySpans(text), () => '[REDACTED PRIVATE KEY]')).replace(CRED_RE, (_, t) => mask(t));
1782
2004
  out = out.replace(EMBEDDED_AWS_RE, (t) => mask(t));
1783
2005
  out = redactHeaderCredentials(out, AUTH_HDR_RE);
1784
2006
  out = out.replace(JWT_RE, (t) => mask(t));
@@ -1808,7 +2030,7 @@ function redactRules(text) {
1808
2030
  out = redactUserFlags(out);
1809
2031
  out = redactCommandFlags(out);
1810
2032
  out = out.replace(QUERY_KEY_RE, (whole, head, value) => (/[A-Za-z0-9]/.test(value) ? head + mask(value) : whole));
1811
- out = out.replace(PRIVKEY_RE, '[REDACTED PRIVATE KEY]').replace(PRIVKEY_OPEN_RE, '[REDACTED PRIVATE KEY]');
2033
+ out = out.replace(PRIVKEY_RE, '[REDACTED PRIVATE KEY]');
1812
2034
  return restoreCodeEnvKeyLiterals(text, out);
1813
2035
  }
1814
2036
  const CASE_MARKERS = [
@@ -1817,6 +2039,11 @@ const CASE_MARKERS = [
1817
2039
  'gsk_', 'syt_', 'retaindb_', 'hsk-', 'mem0_', 'brv_', 'xapp-', 'xai-', 'ntn_', 'fw-', 'fw_', 'fpk_', 'glpat-', 'gloas-', 'gldt-', 'glrt-', 'glrtr-',
1818
2040
  'glcbt-', 'glptt-', 'glft-', 'glimt-', 'glagent-', 'glsoat-', 'glffct-', 'glwt-', 'GR1348941', 'pk-lf-', 'eyJ', '-----BEGIN',
1819
2041
  ];
2042
+ /** The literal prefixes of `CRED_RE` (`xapp-` stands for `xapp-1-`) and `JWT_RE`, the JWT's also as `JWT_ONLY`'s. */
2043
+ const TOKEN_MARKERS = new Set([...CASE_MARKERS.filter((m) => ((TOKEN_PREFIX_RUN_RE.lastIndex = 0), TOKEN_PREFIX_RUN_RE.test(`${m}0-`))), `${JWT_ONLY}eyJ`]);
2044
+ /** What a cross-payload scan assembles: `TOKEN_MARKERS` and a private key's opener, and their proper prefixes. */
2045
+ const PAYLOAD_MARKERS = new Set([...TOKEN_MARKERS, PEM_OPENER]);
2046
+ const PAYLOAD_MARKER_STEMS = new Set([...PAYLOAD_MARKERS].flatMap((m) => Array.from({ length: m.length - 1 }, (_, n) => m.slice(0, n + 1))));
1820
2047
  const LOWER_MARKERS = [
1821
2048
  'authorization: bearer ', 'authorization: bot ', 'private key', 'postgres://', 'postgresql://', 'mysql://', 'mongodb://', 'redis://', 'amqp://', '://',
1822
2049
  'access_token', 'refresh_token', 'id_token', 'api_key', 'apikey', 'client_secret', 'auth_token', 'raw_secret', 'secret_input', 'key_material',
@@ -1833,6 +2060,12 @@ export function mightContainSensitiveText(text) {
1833
2060
  const views = SPLIT_VIEWS.map((gaps) => text.replace(gaps, ''));
1834
2061
  if (CASE_MARKERS.some((m) => views.some((view) => view.includes(m))))
1835
2062
  return true;
2063
+ if (crossPayloadPrefixStarts(text).length)
2064
+ return true;
2065
+ // So is a key or token an escape sequence splits (`pass\x1b[1mword`, `123456789\x1b[0m:…`).
2066
+ return mightContainKeyword(text) || (views[0] !== text && mightContainKeyword(views[0]));
2067
+ }
2068
+ function mightContainKeyword(text) {
1836
2069
  const lower = text.toLowerCase();
1837
2070
  if (LOWER_MARKERS.some((m) => lower.includes(m)))
1838
2071
  return true;
@@ -1896,11 +2129,15 @@ export function redactValue(v, enabled) {
1896
2129
  return redactText(v, enabled);
1897
2130
  if (Array.isArray(v))
1898
2131
  return v.map((item) => redactValue(item, enabled));
1899
- if (v && typeof v === 'object')
1900
- return Object.fromEntries(Object.entries(v).map(([k, val]) => [k, redactValue(val, enabled)]));
1901
- return v;
2132
+ if (!v || typeof v !== 'object')
2133
+ return v;
2134
+ const out = Object.fromEntries(Object.entries(v).map(([k, val]) => [k, redactValue(val, enabled)]));
2135
+ // TAL-604: a diff's `hunks` are re-parsed from its redacted text, which masks spans (a private key) that no single line shows.
2136
+ if (enabled && Array.isArray(out.hunks) && typeof out.diff === 'string')
2137
+ out.hunks = diffHunks(out.diff);
2138
+ return out;
1902
2139
  }
1903
- export const PUBLIC_MESSAGE_INTERNAL_FIELDS = new Set(['api_content', '_row_id', '_state_db_row_id', '_db_row_id', 'state_db_row_id', '_active_turn_token', '_active_turn_user', '_fork_child_turn']);
2140
+ export const PUBLIC_MESSAGE_INTERNAL_FIELDS = new Set(['api_content', '_row_id', '_state_db_row_id', '_state_db_generation', '_db_row_id', 'state_db_row_id', '_active_turn_token', '_active_turn_user', '_fork_child_turn']);
1904
2141
  export function copyJson(value) {
1905
2142
  if (Array.isArray(value))
1906
2143
  return value.map((v) => copyJson(v));
@@ -2007,6 +2244,55 @@ export function buildActiveTurnToken(streamId, pendingStartedAt) {
2007
2244
  return null;
2008
2245
  return `${str(streamId).trim()}:${formatG17(started)}`;
2009
2246
  }
2247
+ /** TAL-452: a user message longer than either limit ships `_collapsible`, so clients fold it behind "Show more". */
2248
+ const COLLAPSIBLE_USER_MESSAGE_LINES = 20;
2249
+ const COLLAPSIBLE_USER_MESSAGE_CHARS = 2000;
2250
+ /**
2251
+ * Whether a public (redacted) row is a typed user message (no steer, wakeup or marker) longer than either limit, measured
2252
+ * without the `[Attached files: ...]` line clients hide.
2253
+ */
2254
+ function isCollapsibleUserMessage(item) {
2255
+ if (item.role !== 'user' || item._steer !== undefined || item._background_update !== undefined || item._marker_kind !== undefined)
2256
+ return false;
2257
+ const text = stripAttachedFilesMarker(messageText(item.content));
2258
+ return text.length > COLLAPSIBLE_USER_MESSAGE_CHARS || text.split('\n').length > COLLAPSIBLE_USER_MESSAGE_LINES;
2259
+ }
2260
+ /**
2261
+ * TAL-600: how clients show a public row. A tool result or consumed steer shows only inside its turn's activity scene
2262
+ * (`in_scene`); a silent background reply, or a row with nothing to show, not at all (`hidden`); every other row on its own.
2263
+ */
2264
+ function messageDisplay(item) {
2265
+ if (item.role === 'tool' || item._steer)
2266
+ return 'in_scene';
2267
+ if (!item.role || item._background_silent)
2268
+ return 'hidden';
2269
+ if (item._marker_kind)
2270
+ return 'row';
2271
+ const shown = Boolean(messageText(item.content).trim()) || (Array.isArray(item.attachments) && item.attachments.length > 0);
2272
+ if (item.role !== 'assistant')
2273
+ return shown ? 'row' : 'hidden';
2274
+ const hasTools = Array.isArray(item.tool_calls) && item.tool_calls.length > 0;
2275
+ return shown || hasTools || Boolean(item.reasoning || item._anchor_activity_scene) ? 'row' : 'hidden';
2276
+ }
2277
+ /**
2278
+ * One user `content[*]` part (Python `_redact_message_content_part`): an `image_url.url` raster data URI passes through
2279
+ * unscanned (TAL-583). The exemption exists only at this schema position; image-shaped values elsewhere are redacted.
2280
+ */
2281
+ function redactUserContentPart(part, enabled) {
2282
+ if (!enabled || !part || typeof part !== 'object' || Array.isArray(part))
2283
+ return redactValue(part, enabled);
2284
+ const p = part;
2285
+ const image = p.image_url;
2286
+ if (p.type !== 'image_url' || !image || typeof image !== 'object' || Array.isArray(image))
2287
+ return redactValue(part, enabled);
2288
+ const url = image.url;
2289
+ if (!isRasterDataUri(url))
2290
+ return redactValue(part, enabled);
2291
+ const rest = Object.fromEntries(Object.entries(image).filter(([k]) => k !== 'url'));
2292
+ const redacted = redactValue({ ...p, image_url: rest }, enabled);
2293
+ redacted.image_url = { ...redacted.image_url, url };
2294
+ return redacted;
2295
+ }
2010
2296
  function publicMessageProjection(message, enabled, activeTurnToken) {
2011
2297
  const isActive = Boolean(message && typeof message === 'object' && message.role === 'user' && activeTurnToken !== null && message._active_turn_token === activeTurnToken);
2012
2298
  const scrubbed = scrubInternalReplayFields([message], { messageRecords: true })[0];
@@ -2016,10 +2302,34 @@ function publicMessageProjection(message, enabled, activeTurnToken) {
2016
2302
  for (const [key, value] of Object.entries(scrubbed)) {
2017
2303
  if (PUBLIC_MESSAGE_INTERNAL_FIELDS.has(key))
2018
2304
  continue;
2019
- item[key] = redactValue(value, enabled);
2305
+ const userParts = key === 'content' && Array.isArray(value) && scrubbed.role === 'user';
2306
+ item[key] = userParts ? value.map((part) => redactUserContentPart(part, enabled)) : redactValue(value, enabled);
2020
2307
  }
2021
2308
  if (isActive)
2022
2309
  item._active_turn_user = true;
2310
+ // Server-owned: a `_collapsible` the stored row carries never survives the projection's own decision.
2311
+ if (isCollapsibleUserMessage(item))
2312
+ item._collapsible = true;
2313
+ else
2314
+ delete item._collapsible;
2315
+ item._display = messageDisplay(item);
2316
+ // TAL-598: stored and Agent rows may carry these as numeric strings or mixed arrays; ship the contract types or nothing.
2317
+ for (const key of ['_ts', '_turnDuration', '_turnTps']) {
2318
+ if (!(key in item))
2319
+ continue;
2320
+ const n = typeof item[key] === 'string' && item[key] !== '' ? Number(item[key]) : item[key];
2321
+ if (typeof n === 'number' && Number.isFinite(n))
2322
+ item[key] = n;
2323
+ else
2324
+ Reflect.deleteProperty(item, key);
2325
+ }
2326
+ if ('reasoning_titles' in item) {
2327
+ const titles = Array.isArray(item.reasoning_titles) ? item.reasoning_titles.filter((t) => typeof t === 'string' && Boolean(t.trim())) : [];
2328
+ if (titles.length)
2329
+ item.reasoning_titles = titles;
2330
+ else
2331
+ delete item.reasoning_titles;
2332
+ }
2023
2333
  return withMessageToolDisplay(scrubbed, item, enabled);
2024
2334
  }
2025
2335
  /**
@@ -2160,7 +2470,7 @@ export function withToolId(data, id) {
2160
2470
  delete frame.tid;
2161
2471
  return frame;
2162
2472
  }
2163
- function redactNestedMessageContainers(value, enabled) {
2473
+ export function redactNestedMessageContainers(value, enabled) {
2164
2474
  const scrubbed = scrubInternalReplayFields(value);
2165
2475
  if (!scrubbed || typeof scrubbed !== 'object' || Array.isArray(scrubbed))
2166
2476
  return redactValue(scrubbed, enabled);