@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.
- package/_release.json +8 -8
- package/dist/api/auth-raw.d.ts +1 -1
- package/dist/api/auth-raw.js +4 -4
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +6 -0
- package/dist/api/automation-raw.js +59 -9
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +163 -10
- package/dist/api/automation-router.js +25 -8
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +700 -15
- package/dist/api/chat-router.js +74 -55
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +47 -2
- package/dist/api/git-router.js +31 -22
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +14 -0
- package/dist/api/raw-routes.js +277 -36
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +10 -0
- package/dist/api/router.js +10 -8
- package/dist/api/router.js.map +1 -1
- package/dist/api/sessions-router.d.ts +1710 -73
- package/dist/api/sessions-router.js +164 -10
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +132 -2
- package/dist/api/settings-router.js +15 -5
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +16 -3
- package/dist/api/sse-routes.js +194 -67
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.js +12 -25
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +425 -19
- package/dist/api/tools-router.js +157 -26
- package/dist/api/tools-router.js.map +1 -1
- package/dist/app.d.ts +0 -9377
- package/dist/app.js +42 -17
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +8 -2
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/oidc.d.ts +5 -2
- package/dist/auth/oidc.js +8 -7
- package/dist/auth/oidc.js.map +1 -1
- package/dist/bin/talaria-web.js +1 -1
- package/dist/bin/talaria-web.js.map +1 -1
- package/dist/cli/dotenv.js +1 -0
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/config/agent-config.d.ts +2 -0
- package/dist/config/agent-config.js +12 -2
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/http/context.d.ts +20 -3
- package/dist/http/context.js +41 -8
- package/dist/http/context.js.map +1 -1
- package/dist/http/csp.d.ts +2 -1
- package/dist/http/csp.js +3 -2
- package/dist/http/csp.js.map +1 -1
- package/dist/onboarding.js +4 -0
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.d.ts +10 -0
- package/dist/profiles/profiles.js +40 -2
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/providers/catalog.d.ts +101 -8
- package/dist/providers/catalog.js +463 -123
- package/dist/providers/catalog.js.map +1 -1
- package/dist/raster-image.d.ts +7 -0
- package/dist/raster-image.js +267 -0
- package/dist/raster-image.js.map +1 -0
- package/dist/redact.d.ts +1 -0
- package/dist/redact.js +354 -44
- package/dist/redact.js.map +1 -1
- package/dist/runtime.js +111 -27
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +5 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +2 -0
- package/dist/sessions/anchor.js +8 -3
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-tasks.d.ts +2 -9
- package/dist/sessions/background-tasks.js +2 -12
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/claude-code.d.ts +19 -0
- package/dist/sessions/claude-code.js +250 -0
- package/dist/sessions/claude-code.js.map +1 -0
- package/dist/sessions/cli-sessions.d.ts +15 -4
- package/dist/sessions/cli-sessions.js +120 -29
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +61 -9
- package/dist/sessions/completions.js +282 -34
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +14 -1
- package/dist/sessions/compress.js +52 -11
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/export.d.ts +5 -0
- package/dist/sessions/export.js +30 -0
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-watcher.d.ts +7 -3
- package/dist/sessions/gateway-watcher.js +31 -19
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/handoff.d.ts +32 -0
- package/dist/sessions/handoff.js +114 -0
- package/dist/sessions/handoff.js.map +1 -0
- package/dist/sessions/journal.d.ts +8 -0
- package/dist/sessions/journal.js +44 -10
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +13 -3
- package/dist/sessions/list.js +46 -15
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +53 -5
- package/dist/sessions/merge.js +219 -23
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/recovery.d.ts +22 -0
- package/dist/sessions/recovery.js +506 -0
- package/dist/sessions/recovery.js.map +1 -0
- package/dist/sessions/relay.d.ts +21 -2
- package/dist/sessions/relay.js +156 -11
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +152 -8
- package/dist/sessions/service.js +640 -72
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +17 -1
- package/dist/sessions/session.js +63 -4
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/state-db-worker.d.ts +1 -0
- package/dist/sessions/state-db-worker.js +33 -0
- package/dist/sessions/state-db-worker.js.map +1 -0
- package/dist/sessions/state-db.d.ts +87 -4
- package/dist/sessions/state-db.js +417 -8
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/store.d.ts +7 -0
- package/dist/sessions/store.js +36 -22
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +10 -0
- package/dist/sessions/streams.js +14 -3
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.d.ts +2 -0
- package/dist/sessions/titles.js +4 -0
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/todo.d.ts +6 -1
- package/dist/sessions/todo.js +11 -4
- package/dist/sessions/todo.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +12 -1
- package/dist/sessions/tool-display.js +50 -1
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +1 -1
- package/dist/sessions/turn-context.js +11 -7
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +67 -11
- package/dist/sessions/turn.js +413 -111
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +59 -0
- package/dist/sessions/wakeup-pause.js +181 -0
- package/dist/sessions/wakeup-pause.js.map +1 -0
- package/dist/settings.d.ts +20 -2
- package/dist/settings.js +45 -9
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/fake.d.ts +4 -4
- package/dist/sidecar/fake.js +5 -2
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/spa.js +2 -1
- package/dist/spa.js.map +1 -1
- package/dist/startup.d.ts +13 -5
- package/dist/startup.js +48 -0
- package/dist/startup.js.map +1 -1
- package/dist/test/harness.js +2 -0
- package/dist/test/harness.js.map +1 -1
- package/dist/test/ts-worker-hooks.d.ts +1 -0
- package/dist/test/ts-worker-hooks.js +24 -0
- package/dist/test/ts-worker-hooks.js.map +1 -0
- package/dist/text/diff.d.ts +9 -14
- package/dist/text/diff.js +74 -108
- package/dist/text/diff.js.map +1 -1
- package/dist/tools/crons.js +45 -8
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +53 -0
- package/dist/tools/dashboard-plugins.js +188 -0
- package/dist/tools/dashboard-plugins.js.map +1 -0
- package/dist/tools/extensions.d.ts +13 -1
- package/dist/tools/extensions.js +132 -60
- package/dist/tools/extensions.js.map +1 -1
- package/dist/tools/health.d.ts +32 -0
- package/dist/tools/health.js +111 -19
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/insights.d.ts +8 -2
- package/dist/tools/insights.js +18 -2
- package/dist/tools/insights.js.map +1 -1
- package/dist/tools/kanban.d.ts +41 -1
- package/dist/tools/kanban.js +113 -2
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/mcp.d.ts +15 -1
- package/dist/tools/mcp.js +99 -5
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/project-os.d.ts +11 -0
- package/dist/tools/project-os.js +267 -0
- package/dist/tools/project-os.js.map +1 -0
- package/dist/tools/skills.d.ts +5 -1
- package/dist/tools/skills.js +5 -3
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/terminal.d.ts +1 -0
- package/dist/tools/terminal.js +1 -1
- package/dist/tools/terminal.js.map +1 -1
- package/dist/tools/updates.d.ts +33 -8
- package/dist/tools/updates.js +236 -57
- package/dist/tools/updates.js.map +1 -1
- package/dist/tools/wiki.d.ts +68 -0
- package/dist/tools/wiki.js +413 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/workspace/escape.d.ts +61 -0
- package/dist/workspace/escape.js +149 -0
- package/dist/workspace/escape.js.map +1 -0
- package/dist/workspace/extract.d.ts +22 -0
- package/dist/workspace/extract.js +308 -0
- package/dist/workspace/extract.js.map +1 -0
- package/dist/workspace/fs.d.ts +19 -3
- package/dist/workspace/fs.js +96 -23
- package/dist/workspace/fs.js.map +1 -1
- package/dist/workspace/git.d.ts +18 -0
- package/dist/workspace/git.js +38 -25
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +4 -4
- package/dist/workspace/media.js +18 -45
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/preview.d.ts +28 -0
- package/dist/workspace/preview.js +110 -0
- package/dist/workspace/preview.js.map +1 -0
- package/dist/workspace/rollback.d.ts +36 -21
- package/dist/workspace/rollback.js +179 -270
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/unzip.js +4 -1
- package/dist/workspace/unzip.js.map +1 -1
- package/dist/workspace/upload.d.ts +9 -4
- package/dist/workspace/upload.js +9 -3
- package/dist/workspace/upload.js.map +1 -1
- package/dist/workspace/worktrees.d.ts +2 -1
- package/dist/workspace/worktrees.js +14 -15
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +4 -2
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/scripts/replay_sidecar.py +25 -1
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/__main__.py +7 -1
- package/sidecar/talaria_sidecar/home.py +52 -2
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +39 -5
- package/sidecar/talaria_sidecar/methods/chat.py +431 -43
- package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
- package/sidecar/talaria_sidecar/methods/commands.py +96 -2
- package/sidecar/talaria_sidecar/methods/cron.py +39 -8
- package/sidecar/talaria_sidecar/methods/gateway.py +32 -15
- package/sidecar/talaria_sidecar/methods/kanban.py +140 -19
- package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
- package/sidecar/talaria_sidecar/methods/process.py +115 -2
- package/sidecar/talaria_sidecar/methods/profiles.py +84 -8
- package/sidecar/talaria_sidecar/methods/providers.py +27 -8
- package/sidecar/talaria_sidecar/methods/runtime.py +3 -0
- package/sidecar/talaria_sidecar/methods/state_db.py +39 -5
- package/sidecar/talaria_sidecar/methods/text.py +17 -1
- package/sidecar/talaria_sidecar/methods/usage.py +257 -4
- package/sidecar/talaria_sidecar/runtime.py +17 -1
- package/static/dist/FILES.txt +127 -125
- package/static/dist/assets/AppShell-g3bkgnvt.js +1 -0
- package/static/dist/assets/ChatPage-oo7bdan6.js +25 -0
- package/static/dist/assets/Dialog-g355qxhp.js +1 -0
- package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +1 -0
- package/static/dist/assets/HubRoute-lmkrbw47.js +2 -0
- package/static/dist/assets/{Markdown-jqrx5es0.js → Markdown-j4kut4j2.js} +125 -125
- package/static/dist/assets/RightPanel-ohlsdzfl.js +1 -0
- package/static/dist/assets/Select-kddq75qc.js +1 -0
- package/static/dist/assets/SessionListPanel-lu3oy0hw.js +1 -0
- package/static/dist/assets/SettingsLayout-o9bv4mgb.js +1 -0
- package/static/dist/assets/States-eq6fe29m.js +1 -0
- package/static/dist/assets/Toaster-pc247u9f.js +1 -0
- package/static/dist/assets/_app-f8n1i0m1.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +1 -0
- package/static/dist/assets/_app.index-bzzv80hk.js +1 -0
- package/static/dist/assets/_app.insights-dzixbryi.js +1 -0
- package/static/dist/assets/_app.kanban-c6hep2us.js +1 -0
- package/static/dist/assets/_app.logs-i69qds98.js +1 -0
- package/static/dist/assets/_app.memory-kl4vf0gd.js +1 -0
- package/static/dist/assets/_app.profiles-b8zinmyp.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-hh27wwu2.js → _app.session._sessionId-fn1bhde6.js} +1 -1
- package/static/dist/assets/_app.settings-cg8plwmf.js +1 -0
- package/static/dist/assets/_app.settings._section-bkwbi9zn.js +3 -0
- package/static/dist/assets/_app.skills-cs47sbvs.js +1 -0
- package/static/dist/assets/_app.tasks-dwvk64tc.js +1 -0
- package/static/dist/assets/_app.todos-c8xjm8p3.js +1 -0
- package/static/dist/assets/_app.workspaces-ehvd1gds.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-oity9y4o.js → abnfDiagram-VCTEODGH-c8kdixke.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-ceaepnyr.js → architectureDiagram-5GKGNRK7-cku06x1p.js} +1 -1
- package/static/dist/assets/{back-eu64w89w.js → back-h7aun7ew.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-n79st4pj.js → blockDiagram-I7D4REHJ-jzthp1wa.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mi73akzk.js → c4Diagram-7LVT6UL2-mwr67mt8.js} +1 -1
- package/static/dist/assets/{cancel-mzvkdjg8.js → cancel-fhi0vcnu.js} +1 -1
- package/static/dist/assets/channel-b2zo73z1.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-laat0g1q.js → chunk-4HAMMTFA-gpq1y228.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-0psy1tr2.js → chunk-75Z2AOVW-ktje58c4.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-lw8uox8x.js → chunk-DU6HZSFF-ofajdixh.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-erassib3.js → chunk-F27PBJKO-cmev85ti.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-fz7rx619.js → chunk-GMAD6QVW-htjgt22y.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-gdb0epb2.js → chunk-GVQU2GXP-qndvoxl7.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-ea8t26qw.js → chunk-IMKFNOWR-e5bkd5q6.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-mb1gu9kz.js → chunk-L3NEJ4N5-mj1155r6.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-eovmccvy.js → chunk-OSK3NFVY-e7gkikcw.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-bo55zjo5.js → chunk-P2QGCYS3-f7t54xfm.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-ja7ohe4h.js → chunk-POPQ4Y6H-i927v9oa.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-e30g9nus.js → chunk-PWAF6VOD-m84lmnyt.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-gbb798f7.js → chunk-SHT3W25Y-mi0tlcu9.js} +1 -1
- package/static/dist/assets/{chunk-SVP7TREG-h2iw8urm.js → chunk-SVP7TREG-dnau702j.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-fd2cottz.js → chunk-TICWLB2K-edem1gkg.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +1 -0
- package/static/dist/assets/{copied-h65fc3cx.js → copied-hcplv46p.js} +1 -1
- package/static/dist/assets/copy-magtofyp.js +1 -0
- package/static/dist/assets/{cynefin-OW5HDTMX-lbltyl5j.js → cynefin-OW5HDTMX-siqlulkl.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-lxhsqq4a.js → cynefinDiagram-5FMLGOSQ-i648tah9.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-gn4nnaln.js → dagre-GXQ25YYZ-mwn6uc17.js} +1 -1
- package/static/dist/assets/{diagram-S7CK7UJ4-pa3ij6q7.js → diagram-S7CK7UJ4-l8abxaes.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-zbipyz57.js → diagram-UQ7AKVKN-mekq7zgq.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-d1kbpzgf.js → diagram-VSXAHHWV-fnky6lvc.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-i3ty14xl.js → diagram-VX7I27RA-xe6r5qfw.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-m8xefqa7.js → diagram-Z3DM3KII-nq07dg7k.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-nz7wj05l.js → ebnfDiagram-PWID7BFC-c62ipm3g.js} +1 -1
- package/static/dist/assets/endpoints-klbxod4t.js +64 -0
- package/static/dist/assets/{erDiagram-RLTQ6QDP-fa41ib83.js → erDiagram-RLTQ6QDP-h39kmnzy.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-n7zq01qu.js → ganttDiagram-EL5Y4UJY-ngbsyp37.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-c89emb07.js → gitGraph-4MIJSDKK-fr2i7caa.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-cz7cgr6w.js → gitGraphDiagram-WWUBYQGX-eravdti4.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-d9bapmni.js → highlighted-body-KPVGNVTW-jwpop9p8.js} +1 -1
- package/static/dist/assets/host-i828xuo7.js +1 -0
- package/static/dist/assets/index-eh8zilnv.css +2 -0
- package/static/dist/assets/index-r648f4o1.js +11 -0
- package/static/dist/assets/{info-A6RAGUB7-ndddhhhh.js → info-A6RAGUB7-h11x0dxo.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-ccxigcpf.js → infoDiagram-27XIBGKW-dfh47dw9.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-le0z9vtc.js → ishikawaDiagram-5VMMS53U-i6ypq351.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-ivsmb26o.js → journeyDiagram-3NMN7TZE-lduf1z95.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-h6n2awt0.js → kanban-definition-UXKFOSKX-e18bu4pg.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +1 -0
- package/static/dist/assets/{line-dmzlfe0u.js → line-meizqsvn.js} +1 -1
- package/static/dist/assets/link-oot2yn73.js +1 -0
- package/static/dist/assets/login-gu28l9ou.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-gwyd5bnq.js → mermaid-parser.core-ntne45i9.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-l68gg5h7.js → mindmap-definition-YA3MSWOX-27b26eok.js} +1 -1
- package/static/dist/assets/onboarding-lkphzu1s.js +1 -0
- package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-gpv06065.js → packet-AYTQ26CC-l6jdka8p.js} +1 -1
- package/static/dist/assets/{pegDiagram-XKGWAZYB-e52vs23u.js → pegDiagram-XKGWAZYB-g1er3bxj.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-l6m7nz5s.js → pie-WAS4IAKB-i0ylcrt9.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-b4is36bq.js → pieDiagram-E7YTZNPT-fbz1e55z.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-m8vt2788.js → quadrantDiagram-AXDQQJYC-hhue7d8o.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-nxbrhiov.js → radar-RG4KPBEZ-f9b70aa4.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-222mu9hi.js → railroad-74A4TZTK-lgsuoeda.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-o8lldfzv.js → railroadDiagram-O6MQD6OU-eqpy9fnz.js} +1 -1
- package/static/dist/assets/refresh-abtu93ke.js +1 -0
- package/static/dist/assets/refresh-cw-hlwb02qv.js +1 -0
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-ovyq38kv.js → requirementDiagram-BXWQKSXE-ogf6puhi.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-ou7lznor.js → sankeyDiagram-P5KCCOFB-fqb8xcjf.js} +1 -1
- package/static/dist/assets/{saved-bazmcup9.js → saved-girnabkf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-ovckdzf2.js → sequenceDiagram-WJ2MYXX4-dlcz6qjz.js} +1 -1
- package/static/dist/assets/{settings_section_extensions_title-ertwwhlx.js → settings_section_extensions_title-h14cwk6f.js} +1 -1
- package/static/dist/assets/share._token-kl0r7ido.js +2 -0
- package/static/dist/assets/sliders-horizontal-n1zm34qq.js +1 -0
- package/static/dist/assets/sse-iwku0sjo.js +1 -0
- package/static/dist/assets/{stateDiagram-D77RDMKH-fcrexkkv.js → stateDiagram-D77RDMKH-fyoznpcs.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-f7usu8fw.js → swimlanes-42K2YHIH-oefldhfy.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-gp1hvz9f.js → timeline-definition-24CTP7MA-b1vl2zil.js} +1 -1
- package/static/dist/assets/todoStore-jjr5yr78.js +1 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-gb9gf11u.js → treeView-Q6P3EWNA-f7hcci5o.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-nuvfnvvi.js → treemap-WGGIJYW6-nl85071a.js} +1 -1
- package/static/dist/assets/units-kgxzxfhi.js +1 -0
- package/static/dist/assets/{untitled-htelhc68.js → untitled-cikfjntn.js} +1 -1
- package/static/dist/assets/{useForm-h2t0u14e.js → useForm-kqoqg0k9.js} +1 -1
- package/static/dist/assets/useLocale-o59tbiea.js +1 -0
- package/static/dist/assets/{useParams-dqd64jv7.js → useParams-b4dq6n4q.js} +1 -1
- package/static/dist/assets/{useSearch-j30pvsy7.js → useSearch-ipfmv3he.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-fzchbzaj.js → vennDiagram-4TSXK5OY-h5hzbk0n.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-m47mhfbh.js → wardley-WFR3VGLG-jftvpm3e.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-odg6ct1z.js → wardleyDiagram-VM6X3IG4-hedh85ge.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-mrhms5um.js → xychartDiagram-S5SC5T6Z-e49523ab.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +2 -2
- package/static/dist/assets/AppShell-ef3bhu32.js +0 -1
- package/static/dist/assets/Button-nx37f4u1.js +0 -1
- package/static/dist/assets/ChatPage-cdcpykcg.js +0 -25
- package/static/dist/assets/Dialog-mec42hvb.js +0 -1
- package/static/dist/assets/HubRoute-ecb65zpr.js +0 -2
- package/static/dist/assets/RightPanel-d1lgvk4s.js +0 -1
- package/static/dist/assets/Select-h4ivl9qf.js +0 -1
- package/static/dist/assets/SessionListPanel-ewib046b.js +0 -1
- package/static/dist/assets/SettingsLayout-lx654cup.js +0 -1
- package/static/dist/assets/States-ehsb6lzo.js +0 -1
- package/static/dist/assets/Toaster-mch1pa3t.js +0 -1
- package/static/dist/assets/_app-m8d961ef.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-mp33hbzi.js +0 -1
- package/static/dist/assets/_app.index-dk6zp7e0.js +0 -1
- package/static/dist/assets/_app.insights-jt2fk4i1.js +0 -1
- package/static/dist/assets/_app.kanban-if4pubeu.js +0 -1
- package/static/dist/assets/_app.logs-mfaw9m6g.js +0 -1
- package/static/dist/assets/_app.memory-h3eaarb6.js +0 -1
- package/static/dist/assets/_app.profiles-ienktovs.js +0 -1
- package/static/dist/assets/_app.settings-dpoe0bzf.js +0 -1
- package/static/dist/assets/_app.settings._section-l468ynag.js +0 -3
- package/static/dist/assets/_app.skills-kcbncc8i.js +0 -1
- package/static/dist/assets/_app.tasks-occdrqhw.js +0 -2
- package/static/dist/assets/_app.todos-nnke2rcc.js +0 -1
- package/static/dist/assets/_app.workspaces-cdlatvwj.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-hj11333z.js +0 -1
- package/static/dist/assets/channel-mbvmf2vv.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-o8r05k0n.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-o8r05k0n.js +0 -1
- package/static/dist/assets/copy-e6977uwq.js +0 -1
- package/static/dist/assets/endpoints-k7yf25m0.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-kpbq09bx.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-lcz0kx14.js +0 -1
- package/static/dist/assets/index-h00usru2.js +0 -11
- package/static/dist/assets/index-n73ijkv2.css +0 -2
- package/static/dist/assets/lazyRouteComponent-m1rtyk4t.js +0 -1
- package/static/dist/assets/link-budeg5t9.js +0 -1
- package/static/dist/assets/login-kjhasvp8.js +0 -1
- package/static/dist/assets/matchContext-f8oy3lo7.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-jb5d211j.js +0 -1
- package/static/dist/assets/onboarding-cdfrk0pj.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-kdvgl6x8.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-itiqslby.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-go7kov78.js +0 -1
- package/static/dist/assets/refresh-cw-kbcje1uy.js +0 -1
- package/static/dist/assets/search-jen74z4u.js +0 -1
- package/static/dist/assets/share._token-dan9hgvj.js +0 -2
- package/static/dist/assets/sliders-horizontal-f9cb3lh3.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-lcfraua2.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ogmanni0.js +0 -8
- package/static/dist/assets/todoStore-eqtid4r4.js +0 -1
- package/static/dist/assets/useLocale-hcsb84pj.js +0 -1
- 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
|
-
/**
|
|
215
|
-
|
|
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
|
-
|
|
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
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
const
|
|
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
|
|
274
|
-
/**
|
|
275
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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 (
|
|
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 || !
|
|
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
|
-
|
|
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
|
-
|
|
334
|
-
|
|
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
|
-
|
|
340
|
-
if (
|
|
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
|
|
356
|
-
if (
|
|
391
|
+
for (const start of starts.sort((a, b) => a - b)) {
|
|
392
|
+
if (start < walked)
|
|
357
393
|
continue;
|
|
358
|
-
const [span, reached] = payloadRunSpan(text,
|
|
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 (!
|
|
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 (
|
|
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
|
|
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) +
|
|
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]')
|
|
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
|
|
1900
|
-
return
|
|
1901
|
-
|
|
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
|
-
|
|
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);
|