@maudecode/talaria-web 1.18.0 → 1.19.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.js +16 -16
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +2 -2
- package/dist/api/automation-raw.js +32 -32
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +102 -22
- package/dist/api/automation-router.js +15 -13
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1205 -34
- package/dist/api/chat-router.js +158 -78
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +2 -2
- package/dist/api/git-router.js +29 -29
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +3 -3
- package/dist/api/raw-routes.js +63 -61
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +6 -6
- package/dist/api/router.js +22 -22
- package/dist/api/router.js.map +1 -1
- package/dist/api/session-visibility.d.ts +4 -4
- package/dist/api/session-visibility.js +26 -16
- package/dist/api/session-visibility.js.map +1 -1
- package/dist/api/sessions-router.d.ts +1928 -124
- package/dist/api/sessions-router.js +177 -173
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +427 -9
- package/dist/api/settings-router.js +48 -32
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +2 -2
- package/dist/api/sse-routes.js +63 -63
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +58 -33
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +663 -91
- package/dist/api/tools-router.js +309 -52
- package/dist/api/tools-router.js.map +1 -1
- package/dist/api/transcribe-stream.d.ts +16 -0
- package/dist/api/transcribe-stream.js +172 -0
- package/dist/api/transcribe-stream.js.map +1 -0
- package/dist/app.d.ts +4 -1
- package/dist/app.js +66 -47
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +10 -9
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/passkeys.d.ts +15 -14
- package/dist/auth/passkeys.js +89 -91
- package/dist/auth/passkeys.js.map +1 -1
- package/dist/auth/store.d.ts +17 -7
- package/dist/auth/store.js +93 -52
- package/dist/auth/store.js.map +1 -1
- package/dist/bin/talaria-web.js +12 -81
- package/dist/bin/talaria-web.js.map +1 -1
- package/dist/cli/ctl.js +2 -1
- package/dist/cli/ctl.js.map +1 -1
- package/dist/cli/dotenv.d.ts +5 -0
- package/dist/cli/dotenv.js +14 -2
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/cli/launcher.js +5 -5
- package/dist/cli/launcher.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +85 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/supervise.d.ts +2 -0
- package/dist/cli/supervise.js +67 -4
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +34 -11
- package/dist/config/agent-config.js +113 -58
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/fs/atomic.d.ts +1 -0
- package/dist/fs/atomic.js +4 -1
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +1 -0
- package/dist/fs/stat.js +11 -0
- package/dist/fs/stat.js.map +1 -0
- package/dist/http/context.d.ts +14 -9
- package/dist/http/context.js +29 -20
- package/dist/http/context.js.map +1 -1
- package/dist/onboarding.d.ts +2 -2
- package/dist/onboarding.js +10 -8
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.d.ts +10 -4
- package/dist/profiles/profiles.js +77 -30
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/projects.d.ts +15 -6
- package/dist/projects.js +55 -47
- package/dist/projects.js.map +1 -1
- package/dist/providers/catalog.d.ts +78 -12
- package/dist/providers/catalog.js +445 -141
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/env-file.d.ts +10 -3
- package/dist/providers/env-file.js +24 -75
- package/dist/providers/env-file.js.map +1 -1
- package/dist/providers/runtime-env.d.ts +4 -2
- package/dist/providers/runtime-env.js +9 -6
- package/dist/providers/runtime-env.js.map +1 -1
- package/dist/providers/tables.d.ts +3 -1
- package/dist/providers/tables.js +4 -2
- package/dist/providers/tables.js.map +1 -1
- package/dist/redact.js +18 -9
- package/dist/redact.js.map +1 -1
- package/dist/release.d.ts +7 -0
- package/dist/release.js +14 -0
- package/dist/release.js.map +1 -1
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.js +233 -90
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +9 -3
- package/dist/sessions/anchor.js +28 -36
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-events.d.ts +2 -0
- package/dist/sessions/background-events.js +10 -0
- package/dist/sessions/background-events.js.map +1 -0
- package/dist/sessions/background-tasks.d.ts +26 -20
- package/dist/sessions/background-tasks.js +88 -86
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/background-updates.d.ts +15 -8
- package/dist/sessions/background-updates.js +101 -25
- package/dist/sessions/background-updates.js.map +1 -1
- package/dist/sessions/cli-sessions.d.ts +15 -5
- package/dist/sessions/cli-sessions.js +62 -43
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +30 -2
- package/dist/sessions/completions.js +294 -53
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +8 -0
- package/dist/sessions/compress.js +2 -2
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/drafts.d.ts +14 -10
- package/dist/sessions/drafts.js +38 -43
- package/dist/sessions/drafts.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +46 -0
- package/dist/sessions/gateway-sessions.js +378 -0
- package/dist/sessions/gateway-sessions.js.map +1 -0
- package/dist/sessions/goals.d.ts +31 -0
- package/dist/sessions/goals.js +75 -0
- package/dist/sessions/goals.js.map +1 -0
- package/dist/sessions/journal.d.ts +5 -79
- package/dist/sessions/journal.js +15 -606
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +27 -18
- package/dist/sessions/list.js +133 -131
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +68 -10
- package/dist/sessions/merge.js +259 -51
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/notices.d.ts +22 -0
- package/dist/sessions/notices.js +72 -0
- package/dist/sessions/notices.js.map +1 -0
- package/dist/sessions/pending.d.ts +10 -4
- package/dist/sessions/pending.js +83 -7
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +82 -0
- package/dist/sessions/prefix-index.js +232 -0
- package/dist/sessions/prefix-index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +4 -7
- package/dist/sessions/recovery.js +97 -281
- package/dist/sessions/recovery.js.map +1 -1
- package/dist/sessions/relay.d.ts +20 -20
- package/dist/sessions/relay.js +205 -127
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +162 -59
- package/dist/sessions/service.js +1133 -521
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +18 -2
- package/dist/sessions/session.js +29 -5
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/shares.d.ts +7 -6
- package/dist/sessions/shares.js +22 -45
- package/dist/sessions/shares.js.map +1 -1
- package/dist/sessions/source-kind.js +1 -0
- package/dist/sessions/source-kind.js.map +1 -1
- package/dist/sessions/state-db-identity.d.ts +18 -0
- package/dist/sessions/state-db-identity.js +67 -0
- package/dist/sessions/state-db-identity.js.map +1 -0
- package/dist/sessions/state-db-worker.js +3 -1
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +53 -8
- package/dist/sessions/state-db.js +576 -50
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +162 -0
- package/dist/sessions/storage/backend.js +19 -0
- package/dist/sessions/storage/backend.js.map +1 -0
- package/dist/sessions/storage/conformance.d.ts +20 -0
- package/dist/sessions/storage/conformance.js +237 -0
- package/dist/sessions/storage/conformance.js.map +1 -0
- package/dist/sessions/storage/document.d.ts +16 -0
- package/dist/sessions/storage/document.js +44 -0
- package/dist/sessions/storage/document.js.map +1 -0
- package/dist/sessions/storage/json-documents.d.ts +23 -0
- package/dist/sessions/storage/json-documents.js +233 -0
- package/dist/sessions/storage/json-documents.js.map +1 -0
- package/dist/sessions/storage/json-files.d.ts +12 -0
- package/dist/sessions/storage/json-files.js +124 -0
- package/dist/sessions/storage/json-files.js.map +1 -0
- package/dist/sessions/storage/json-installation.d.ts +3 -0
- package/dist/sessions/storage/json-installation.js +31 -0
- package/dist/sessions/storage/json-installation.js.map +1 -0
- package/dist/sessions/storage/json-journal.d.ts +114 -0
- package/dist/sessions/storage/json-journal.js +686 -0
- package/dist/sessions/storage/json-journal.js.map +1 -0
- package/dist/sessions/storage/json-recovery.d.ts +4 -0
- package/dist/sessions/storage/json-recovery.js +195 -0
- package/dist/sessions/storage/json-recovery.js.map +1 -0
- package/dist/sessions/storage/json.d.ts +68 -0
- package/dist/sessions/storage/json.js +258 -0
- package/dist/sessions/storage/json.js.map +1 -0
- package/dist/sessions/storage/row.d.ts +6 -0
- package/dist/sessions/storage/row.js +49 -0
- package/dist/sessions/storage/row.js.map +1 -0
- package/dist/sessions/storage/search-text.d.ts +4 -0
- package/dist/sessions/storage/search-text.js +16 -0
- package/dist/sessions/storage/search-text.js.map +1 -0
- package/dist/sessions/store.d.ts +63 -73
- package/dist/sessions/store.js +305 -611
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +4 -0
- package/dist/sessions/streams.js +9 -1
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.js +1 -1
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/todo.d.ts +5 -0
- package/dist/sessions/todo.js +28 -21
- package/dist/sessions/todo.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +5 -4
- package/dist/sessions/tool-display.js +22 -16
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +10 -1
- package/dist/sessions/turn-context.js +7 -4
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +87 -17
- package/dist/sessions/turn.js +795 -347
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +8 -13
- package/dist/sessions/wakeup-pause.js +31 -49
- package/dist/sessions/wakeup-pause.js.map +1 -1
- package/dist/sessions/window.js +13 -12
- package/dist/sessions/window.js.map +1 -1
- package/dist/settings.d.ts +19 -7
- package/dist/settings.js +179 -183
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/client.d.ts +17 -3
- package/dist/sidecar/client.js +78 -8
- package/dist/sidecar/client.js.map +1 -1
- package/dist/sidecar/discover.d.ts +2 -1
- package/dist/sidecar/discover.js +93 -10
- package/dist/sidecar/discover.js.map +1 -1
- package/dist/sidecar/env.d.ts +4 -0
- package/dist/sidecar/env.js +3 -0
- package/dist/sidecar/env.js.map +1 -0
- package/dist/sidecar/fake.js +19 -2
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/test/env-file.d.ts +5 -0
- package/dist/test/env-file.js +88 -0
- package/dist/test/env-file.js.map +1 -0
- package/dist/test/harness.d.ts +1 -0
- package/dist/test/harness.js +1 -1
- package/dist/test/harness.js.map +1 -1
- package/dist/test/passkeys.d.ts +22 -0
- package/dist/test/passkeys.js +62 -0
- package/dist/test/passkeys.js.map +1 -0
- package/dist/test/storage.d.ts +15 -0
- package/dist/test/storage.js +26 -0
- package/dist/test/storage.js.map +1 -0
- package/dist/tools/commands.d.ts +6 -1
- package/dist/tools/commands.js +8 -2
- package/dist/tools/commands.js.map +1 -1
- package/dist/tools/connectors.d.ts +33 -0
- package/dist/tools/connectors.js +121 -0
- package/dist/tools/connectors.js.map +1 -0
- package/dist/tools/crons.d.ts +38 -1
- package/dist/tools/crons.js +82 -15
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +5 -5
- package/dist/tools/dashboard-plugins.js +14 -14
- package/dist/tools/dashboard-plugins.js.map +1 -1
- package/dist/tools/extensions.d.ts +5 -4
- package/dist/tools/extensions.js +213 -207
- package/dist/tools/extensions.js.map +1 -1
- package/dist/tools/gateway-restart.d.ts +62 -0
- package/dist/tools/gateway-restart.js +142 -0
- package/dist/tools/gateway-restart.js.map +1 -0
- package/dist/tools/health.d.ts +15 -3
- package/dist/tools/health.js +97 -34
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/hygiene.d.ts +4 -3
- package/dist/tools/hygiene.js +23 -9
- package/dist/tools/hygiene.js.map +1 -1
- package/dist/tools/kanban.d.ts +4 -2
- package/dist/tools/kanban.js +28 -19
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/memory-masks.d.ts +5 -0
- package/dist/tools/memory-masks.js +256 -0
- package/dist/tools/memory-masks.js.map +1 -0
- package/dist/tools/memory.d.ts +29 -3
- package/dist/tools/memory.js +69 -27
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/plugin-settings.d.ts +15 -0
- package/dist/tools/plugin-settings.js +90 -0
- package/dist/tools/plugin-settings.js.map +1 -0
- package/dist/tools/skills.d.ts +9 -4
- package/dist/tools/skills.js +44 -13
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +34 -15
- package/dist/tools/update-notifications.js +141 -57
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/update-rollback.d.ts +11 -0
- package/dist/tools/update-rollback.js +28 -0
- package/dist/tools/update-rollback.js.map +1 -0
- package/dist/tools/updates.d.ts +93 -33
- package/dist/tools/updates.js +1051 -345
- package/dist/tools/updates.js.map +1 -1
- package/dist/util.d.ts +2 -0
- package/dist/util.js +5 -0
- package/dist/util.js.map +1 -1
- package/dist/workspace/git.d.ts +16 -1
- package/dist/workspace/git.js +291 -11
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +12 -9
- package/dist/workspace/media.js +31 -20
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/rollback.d.ts +2 -2
- package/dist/workspace/rollback.js +5 -5
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/workspaces.d.ts +15 -19
- package/dist/workspace/workspaces.js +55 -127
- package/dist/workspace/workspaces.js.map +1 -1
- package/dist/workspace/worktrees.js +170 -32
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +5 -3
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +26 -0
- package/sidecar/scripts/record-fixtures.py +12 -3
- package/sidecar/scripts/replay_sidecar.py +8 -0
- package/sidecar/scripts/suite_runner.py +302 -0
- package/sidecar/scripts/test.sh +12 -4
- package/sidecar/talaria_sidecar/__init__.py +6 -1
- package/sidecar/talaria_sidecar/__main__.py +4 -2
- package/sidecar/talaria_sidecar/agent_mutation.py +975 -0
- package/sidecar/talaria_sidecar/agent_services.py +1053 -0
- package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
- package/sidecar/talaria_sidecar/home.py +43 -1
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +139 -31
- package/sidecar/talaria_sidecar/methods/chat.py +847 -134
- package/sidecar/talaria_sidecar/methods/commands.py +213 -4
- package/sidecar/talaria_sidecar/methods/config.py +123 -4
- package/sidecar/talaria_sidecar/methods/connectors.py +343 -0
- package/sidecar/talaria_sidecar/methods/cron.py +366 -34
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +194 -54
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +234 -0
- package/sidecar/talaria_sidecar/methods/goals.py +81 -41
- package/sidecar/talaria_sidecar/methods/kanban.py +80 -27
- package/sidecar/talaria_sidecar/methods/memory.py +84 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +5 -2
- package/sidecar/talaria_sidecar/methods/process.py +160 -11
- package/sidecar/talaria_sidecar/methods/profiles.py +44 -6
- package/sidecar/talaria_sidecar/methods/providers.py +196 -26
- package/sidecar/talaria_sidecar/methods/runtime.py +69 -1
- package/sidecar/talaria_sidecar/methods/skills.py +67 -4
- package/sidecar/talaria_sidecar/methods/state_db.py +277 -70
- package/sidecar/talaria_sidecar/methods/stt.py +159 -78
- package/sidecar/talaria_sidecar/methods/text.py +14 -1
- package/sidecar/talaria_sidecar/methods/toolsets.py +49 -0
- package/sidecar/talaria_sidecar/methods/usage.py +113 -14
- package/sidecar/talaria_sidecar/methods/worktree.py +26 -19
- package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
- package/sidecar/talaria_sidecar/rpc.py +45 -4
- package/sidecar/talaria_sidecar/runtime.py +81 -12
- package/sidecar/talaria_sidecar/speed.py +35 -0
- package/static/dist/FILES.txt +126 -127
- package/static/dist/assets/AppShell-cey33v9s.js +8 -0
- package/static/dist/assets/ChatPage-i8wnugr7.js +18 -0
- package/static/dist/assets/ConnectTargets-hg19553x.js +1 -0
- package/static/dist/assets/ExtensionRoute-cly4apm5.js +1 -0
- package/static/dist/assets/Field-j8uqoigz.js +9 -0
- package/static/dist/assets/HubRoute-e4bgz41j.js +2 -0
- package/static/dist/assets/Markdown-lahuichm.js +598 -0
- package/static/dist/assets/RightPanel-lbo4i0fn.js +1 -0
- package/static/dist/assets/Select-gqatm2e0.js +1 -0
- package/static/dist/assets/SessionListPanel-mfqayfjh.js +1 -0
- package/static/dist/assets/SettingsLayout-b8980u7k.js +1 -0
- package/static/dist/assets/States-e7dkgtxf.js +1 -0
- package/static/dist/assets/Toaster-bfqqy786.js +1 -0
- package/static/dist/assets/_app-n1n6pfx1.js +1 -0
- package/static/dist/assets/{_app.ext._extensionId-gfbzpoou.js → _app.ext._extensionId-buxjxav3.js} +1 -1
- package/static/dist/assets/_app.index-jt8zwiu2.js +1 -0
- package/static/dist/assets/_app.insights-cv76ml71.js +1 -0
- package/static/dist/assets/_app.kanban-h6ts53j7.js +1 -0
- package/static/dist/assets/_app.logs-dm873z90.js +1 -0
- package/static/dist/assets/_app.memory-glk5y6m8.js +1 -0
- package/static/dist/assets/_app.profiles-ka6zpstq.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-fn1bhde6.js → _app.session._sessionId-g2vzghvc.js} +1 -1
- package/static/dist/assets/_app.settings-hgjdhzcd.js +1 -0
- package/static/dist/assets/_app.settings._section-jf2kmhae.js +3 -0
- package/static/dist/assets/_app.skills-cii852yq.js +1 -0
- package/static/dist/assets/_app.tasks-fp9q7atm.js +1 -0
- package/static/dist/assets/_app.todos-dw94qzue.js +1 -0
- package/static/dist/assets/_app.workspaces-inyygzze.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-c8kdixke.js → abnfDiagram-VCTEODGH-gjayq3ra.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-cku06x1p.js → architectureDiagram-5GKGNRK7-nwb3xovn.js} +1 -1
- package/static/dist/assets/archive-b1j004vn.js +1 -0
- package/static/dist/assets/back-g74gkozu.js +1 -0
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-joedghi3.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-hyrjrohe.js} +1 -1
- package/static/dist/assets/channel-es95o4y8.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-koouqbut.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-bl4bhdnt.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-ofajdixh.js → chunk-DU6HZSFF-gpedttsp.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-d8xxi0zi.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-jro0hl73.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-djn6gbyu.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-vw4p5p7o.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-n1hj77q8.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-e7gkikcw.js → chunk-OSK3NFVY-oy0gwn2n.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-onf1hz6c.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-m8sqn7cs.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-ek4smc8x.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-g9gfvefo.js} +3 -3
- package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-f9nfv2cu.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-bnk3m1mq.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-kmihoqxh.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-kmihoqxh.js +1 -0
- package/static/dist/assets/copied-bli9tbcx.js +1 -0
- package/static/dist/assets/{copy-magtofyp.js → copy-jamtd1pf.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-siqlulkl.js → cynefin-OW5HDTMX-f8xfdd3f.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-i648tah9.js → cynefinDiagram-5FMLGOSQ-n9lb99h9.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-mwn6uc17.js → dagre-GXQ25YYZ-dgailddi.js} +4 -4
- package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-m6aeoe7c.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-mekq7zgq.js → diagram-UQ7AKVKN-jall3j0x.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-hbawi7hn.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-xe6r5qfw.js → diagram-VX7I27RA-hendl2tt.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-nq07dg7k.js → diagram-Z3DM3KII-igwc35p3.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-c62ipm3g.js → ebnfDiagram-PWID7BFC-c64knz08.js} +1 -1
- package/static/dist/assets/{erDiagram-RLTQ6QDP-h39kmnzy.js → erDiagram-RLTQ6QDP-brdu9lcm.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-njk1j8wl.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-nma6f0ga.js +1 -0
- package/static/dist/assets/folder-plus-lvt9kudb.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-ma6jxj5i.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-fr2i7caa.js → gitGraph-4MIJSDKK-naa9w6xa.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-hzltvsod.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-jwpop9p8.js → highlighted-body-KPVGNVTW-ghoavj8d.js} +1 -1
- package/static/dist/assets/host-hzm8n85n.js +1 -0
- package/static/dist/assets/index-drdcaqeq.css +2 -0
- package/static/dist/assets/index-jzm844he.js +11 -0
- package/static/dist/assets/{info-A6RAGUB7-h11x0dxo.js → info-A6RAGUB7-mn2ut5ko.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-dfh47dw9.js → infoDiagram-27XIBGKW-h6kuqvsb.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-e7bnwq7h.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-etd1bi6p.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-emb1g9dz.js} +4 -4
- package/static/dist/assets/lazyRouteComponent-o816ytzl.js +1 -0
- package/static/dist/assets/{line-meizqsvn.js → line-h0ojzsvs.js} +1 -1
- package/static/dist/assets/link-k01ryaf9.js +1 -0
- package/static/dist/assets/login-bsae49ew.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-ihl34s74.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-ntne45i9.js → mermaid-parser.core-bnre27u8.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-o1vathns.js} +1 -1
- package/static/dist/assets/onboarding-c65tysya.js +1 -0
- package/static/dist/assets/onboarding_model_label-gpn28uix.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-l6jdka8p.js → packet-AYTQ26CC-hatq7m2e.js} +1 -1
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/{pegDiagram-XKGWAZYB-g1er3bxj.js → pegDiagram-XKGWAZYB-gwisz8jv.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-i0ylcrt9.js → pie-WAS4IAKB-fpftf0mk.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-fbz1e55z.js → pieDiagram-E7YTZNPT-khm1o9a6.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-owqc4uqn.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-f9b70aa4.js → radar-RG4KPBEZ-cntfwjpq.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-lgsuoeda.js → railroad-74A4TZTK-a7t5eibp.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-ol8cdktf.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-i8vzd429.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-nw3ulewz.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-eqpy9fnz.js → railroadDiagram-O6MQD6OU-etuh0qa0.js} +1 -1
- package/static/dist/assets/{refresh-cw-hlwb02qv.js → refresh-cw-mqbkv2a3.js} +1 -1
- package/static/dist/assets/refresh-l29ljp76.js +1 -0
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-ogf6puhi.js → requirementDiagram-BXWQKSXE-oq2ulk22.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-iqc02emv.js} +1 -1
- package/static/dist/assets/saved-ndd4t2xb.js +1 -0
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-i0v116q0.js} +2 -2
- package/static/dist/assets/settings_section_extensions_title-jhfo6o8z.js +1 -0
- package/static/dist/assets/share._token-c1ri0hy1.js +2 -0
- package/static/dist/assets/sliders-horizontal-j3jjt9tv.js +1 -0
- package/static/dist/assets/{stateDiagram-D77RDMKH-fyoznpcs.js → stateDiagram-D77RDMKH-dnpt1ato.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-oefldhfy.js → swimlanes-42K2YHIH-loqbdazb.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-ol2hnvma.js} +1 -1
- package/static/dist/assets/toast-i3h34v6o.js +64 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-f7hcci5o.js → treeView-Q6P3EWNA-idrj6iox.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-nl85071a.js → treemap-WGGIJYW6-lzr49vv5.js} +1 -1
- package/static/dist/assets/untitled-oaoya4qj.js +1 -0
- package/static/dist/assets/useForm-nfaxgmsk.js +1 -0
- package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-gjc70qru.js} +1 -1
- package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-e6ae539u.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-h5hzbk0n.js → vennDiagram-4TSXK5OY-bvwr9o2z.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-jftvpm3e.js → wardley-WFR3VGLG-31ui8tma.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-hedh85ge.js → wardleyDiagram-VM6X3IG4-k5wqtx4b.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-aqbgvujg.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +1 -1
- package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
- package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
- package/static/dist/assets/Dialog-g355qxhp.js +0 -1
- package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
- package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
- package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
- package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
- package/static/dist/assets/Select-kddq75qc.js +0 -1
- package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
- package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
- package/static/dist/assets/States-eq6fe29m.js +0 -1
- package/static/dist/assets/Toaster-pc247u9f.js +0 -1
- package/static/dist/assets/_app-f8n1i0m1.js +0 -1
- package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
- package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
- package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
- package/static/dist/assets/_app.logs-i69qds98.js +0 -1
- package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
- package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
- package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
- package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
- package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
- package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
- package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
- package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
- package/static/dist/assets/back-h7aun7ew.js +0 -1
- package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
- package/static/dist/assets/channel-b2zo73z1.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
- package/static/dist/assets/copied-hcplv46p.js +0 -1
- package/static/dist/assets/endpoints-klbxod4t.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
- package/static/dist/assets/host-i828xuo7.js +0 -1
- package/static/dist/assets/index-eh8zilnv.css +0 -2
- package/static/dist/assets/index-r648f4o1.js +0 -11
- package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
- package/static/dist/assets/link-oot2yn73.js +0 -1
- package/static/dist/assets/login-gu28l9ou.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
- package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
- package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
- package/static/dist/assets/refresh-abtu93ke.js +0 -1
- package/static/dist/assets/saved-girnabkf.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
- package/static/dist/assets/share._token-kl0r7ido.js +0 -2
- package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
- package/static/dist/assets/sse-iwku0sjo.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
- package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
- package/static/dist/assets/units-kgxzxfhi.js +0 -1
- package/static/dist/assets/untitled-cikfjntn.js +0 -1
- package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
- package/static/dist/assets/useLocale-o59tbiea.js +0 -1
|
@@ -181,12 +181,15 @@ def _is_safe_session_id(sid) -> bool:
|
|
|
181
181
|
return isinstance(sid, str) and bool(_SAFE_SESSION_ID.match(sid))
|
|
182
182
|
|
|
183
183
|
|
|
184
|
-
def _clean_artifacts(sessions_dir: Path, removed_id: str) -> bool:
|
|
184
|
+
def _clean_artifacts(sessions_dir: Path, removed_id: str, *, keep_legacy: bool) -> bool:
|
|
185
185
|
if not _is_safe_session_id(removed_id):
|
|
186
186
|
return False
|
|
187
187
|
ok = True
|
|
188
|
-
|
|
189
|
-
|
|
188
|
+
# ``session_<id>.json`` is the legacy snapshot older Agents wrote; it can carry plaintext secrets. It is kept while a
|
|
189
|
+
# live session's id is ``session_<id>``, because then it is that session's own transcript.
|
|
190
|
+
names = [f"{removed_id}.json", f"{removed_id}.jsonl"] + ([] if keep_legacy else [f"session_{removed_id}.json"])
|
|
191
|
+
for name in names:
|
|
192
|
+
artifact = sessions_dir / name
|
|
190
193
|
if artifact.exists():
|
|
191
194
|
try:
|
|
192
195
|
artifact.unlink(missing_ok=True)
|
|
@@ -219,13 +222,13 @@ def _process_manifests(conn, sessions_dir: Path, *, alive_query) -> bool:
|
|
|
219
222
|
mp.unlink(missing_ok=True)
|
|
220
223
|
continue
|
|
221
224
|
try:
|
|
222
|
-
alive = alive_query(conn, pending_ids)
|
|
225
|
+
alive = alive_query(conn, pending_ids + [f"session_{i}" for i in pending_ids])
|
|
223
226
|
except Exception: # noqa: BLE001 - fail closed, retry later
|
|
224
227
|
complete = False
|
|
225
228
|
continue
|
|
226
229
|
still_pending = []
|
|
227
230
|
for removed_id in pending_ids:
|
|
228
|
-
if removed_id in alive or not _clean_artifacts(sessions_dir, removed_id):
|
|
231
|
+
if removed_id in alive or not _clean_artifacts(sessions_dir, removed_id, keep_legacy=f"session_{removed_id}" in alive):
|
|
229
232
|
still_pending.append(removed_id)
|
|
230
233
|
if still_pending:
|
|
231
234
|
tmp = mp.with_suffix(".tmp")
|
|
@@ -288,19 +291,169 @@ def _timestamp_value(value):
|
|
|
288
291
|
return numeric if math.isfinite(numeric) else None
|
|
289
292
|
|
|
290
293
|
|
|
291
|
-
def
|
|
294
|
+
def _is_continuation(parent: dict, child: dict) -> bool:
|
|
295
|
+
"""The server's ``isContinuationSession``: ``child`` resumes ``parent`` after a compression or CLI close."""
|
|
296
|
+
lower = lambda v: str(v or "").strip().lower() # noqa: E731
|
|
297
|
+
if lower(child.get("session_source")) == "fork":
|
|
298
|
+
return False
|
|
299
|
+
if child.get("source") == "tool" or any(child.get(k) is not None for k in ("branched_from", "delegate_from", "reset_from")):
|
|
300
|
+
return False
|
|
301
|
+
if lower(parent.get("source")) and lower(child.get("source")) and lower(parent.get("source")) != lower(child.get("source")):
|
|
302
|
+
return False
|
|
303
|
+
if parent.get("end_reason") not in ("compression", "cli_close"):
|
|
304
|
+
return False
|
|
305
|
+
if parent.get("ended_at") is None:
|
|
306
|
+
return True
|
|
307
|
+
try:
|
|
308
|
+
started, ended = float(child.get("started_at") or 0), float(parent["ended_at"])
|
|
309
|
+
except (TypeError, ValueError):
|
|
310
|
+
return False
|
|
311
|
+
return math.isfinite(started) and math.isfinite(ended) and started + 1.0 >= ended
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
# The Agent's ``_CHAIN_CAP`` and the server's ``COMPRESSION_CHAIN_CAP``: the most hops a compression-chain walk takes.
|
|
315
|
+
_COMPRESSION_CHAIN_CAP = 1000
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def _compression_lineage(records: list[dict], sid: str) -> list[str]:
|
|
319
|
+
"""The server's ``stateDbCompressionLineage``: ``sid`` then each single continuation, up to ``_COMPRESSION_CHAIN_CAP``
|
|
320
|
+
hops, root first."""
|
|
321
|
+
by_id = {r["id"]: r for r in records}
|
|
322
|
+
children: dict[str, list[dict]] = {}
|
|
323
|
+
for r in records:
|
|
324
|
+
children.setdefault(r["parent_id"], []).append(r)
|
|
325
|
+
lineage, current = [sid], by_id.get(sid)
|
|
326
|
+
for _ in range(_COMPRESSION_CHAIN_CAP):
|
|
327
|
+
if current is None:
|
|
328
|
+
break
|
|
329
|
+
nxt = [r for r in children.get(current["id"], []) if _is_continuation(current, r)]
|
|
330
|
+
if len(nxt) != 1 or nxt[0]["id"] in lineage:
|
|
331
|
+
break
|
|
332
|
+
current = nxt[0]
|
|
333
|
+
lineage.append(current["id"])
|
|
334
|
+
return lineage
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class _ActiveWriteGuard(Exception):
|
|
338
|
+
"""Another Agent process holds a live turn lease or compression lock on a row the delete would remove."""
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def _delete_locked(sid: str, home: Path, include_lineage: bool) -> dict:
|
|
292
342
|
stale_complete = _process_stale_manifests(home)
|
|
293
343
|
db_path = home / "state.db"
|
|
294
344
|
if not db_path.exists():
|
|
295
|
-
return False
|
|
345
|
+
return {"ok": False}
|
|
346
|
+
agent_db = _session_db(home)
|
|
347
|
+
if agent_db is None:
|
|
348
|
+
return {"ok": False}
|
|
349
|
+
try:
|
|
350
|
+
guarded = _write_guard_check(agent_db)
|
|
351
|
+
if guarded is None: # fail closed: without the Agent's guard, a live writer's rows cannot be told apart
|
|
352
|
+
log.warning("Agent has no session write-guard check; state.db rows are kept")
|
|
353
|
+
return {"ok": False}
|
|
354
|
+
try:
|
|
355
|
+
from hermes_state_mutation_retirement import delete_in_transaction
|
|
356
|
+
except ModuleNotFoundError as exc:
|
|
357
|
+
if exc.name != "hermes_state_mutation_retirement":
|
|
358
|
+
raise
|
|
359
|
+
result = _delete_rows(sid, include_lineage, home, db_path, guarded)
|
|
360
|
+
else:
|
|
361
|
+
result = _delete_runtime_rows(sid, home, agent_db, guarded, delete_in_transaction)
|
|
362
|
+
return {**result, "ok": result["ok"] and stale_complete}
|
|
363
|
+
finally:
|
|
364
|
+
_close(agent_db)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def _write_guard_check(agent_db):
|
|
368
|
+
"""The Agent's own user-delete guard, ``(conn, ids) -> bool``: true when a live turn lease or compression lock protects
|
|
369
|
+
any id; expired or dead-holder guards are reclaimed. ``_guarded_ids`` from v0.21.6, the per-row check before it."""
|
|
370
|
+
guarded_ids = getattr(agent_db, "_guarded_ids", None)
|
|
371
|
+
if guarded_ids is not None:
|
|
372
|
+
return lambda conn, ids: bool(guarded_ids(conn, ids))
|
|
373
|
+
rejects = getattr(agent_db, "_write_guards_reject", None)
|
|
374
|
+
if rejects is not None:
|
|
375
|
+
return lambda conn, ids: any(rejects(conn, i, allow_closed_compression_parent=True) for i in ids)
|
|
376
|
+
return None
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def _write_cleanup_manifest(home: Path, removed_ids: list[str]) -> None:
|
|
380
|
+
sessions_dir = home / "sessions"
|
|
381
|
+
sessions_dir.mkdir(parents=True, exist_ok=True)
|
|
382
|
+
base = f".cleanup_manifest_{uuid.uuid4().hex}"
|
|
383
|
+
manifest, tmp = sessions_dir / f"{base}.json", sessions_dir / f"{base}.tmp"
|
|
384
|
+
try:
|
|
385
|
+
tmp.write_text(json.dumps(sorted(removed_ids)), encoding="utf-8")
|
|
386
|
+
tmp.rename(manifest)
|
|
387
|
+
except OSError:
|
|
388
|
+
tmp.unlink(missing_ok=True)
|
|
389
|
+
raise
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def _delete_runtime_rows(requested: str, home: Path, agent_db, guarded, delete_in_transaction) -> dict:
|
|
393
|
+
"""Extend the legacy delete with the Agent's canonical target/retirement transaction.
|
|
394
|
+
|
|
395
|
+
Compression and receipt-backed reset segments are one conversation, even when the caller names its tip.
|
|
396
|
+
The Agent owns delegate/fork boundaries, live-ledger refusals, receipt compaction and tombstones.
|
|
397
|
+
"""
|
|
398
|
+
from hermes_state_mutation_guards import delete_targets
|
|
399
|
+
from hermes_state_runtime import RuntimeStoreError
|
|
400
|
+
from hermes_state_media import collect_retired_media
|
|
401
|
+
|
|
402
|
+
def write(conn):
|
|
403
|
+
# The Agent's owner lookup falls back to the physical id on an unreadable receipt; refuse before that loses its owner.
|
|
404
|
+
row = conn.execute("SELECT chat_id FROM sessions WHERE id=?", (requested,)).fetchone()
|
|
405
|
+
owner = row[0] if row else None
|
|
406
|
+
saved = conn.execute("SELECT value FROM state_meta WHERE key=?", ("gateway.local_policy.v1:" + owner,)).fetchone() if owner else None
|
|
407
|
+
if saved is not None:
|
|
408
|
+
from hermes_state_local_lineage import validate_local_lineage
|
|
409
|
+
raw = saved[0]
|
|
410
|
+
if len(raw) > 1_000_000:
|
|
411
|
+
raise ValueError("local receipt exceeds read budget")
|
|
412
|
+
receipt = json.loads(raw)
|
|
413
|
+
ids = receipt.get("lineage", [owner])
|
|
414
|
+
if (receipt.get("session_id") != owner or not isinstance(ids, list) or not ids
|
|
415
|
+
or len(ids) > _COMPRESSION_CHAIN_CAP or not all(isinstance(sid, str) and sid for sid in ids)):
|
|
416
|
+
raise ValueError("invalid local receipt")
|
|
417
|
+
validate_local_lineage(conn, receipt)
|
|
418
|
+
members = conn.execute("SELECT id,chat_id,user_id,session_key,source,model_config FROM sessions WHERE id IN (SELECT value FROM json_each(?))",
|
|
419
|
+
(json.dumps(ids),)).fetchall()
|
|
420
|
+
if len(members) != len(ids) or any(tuple(member)[1:4] != (owner, receipt["principal_id"], receipt["route"]) for member in members):
|
|
421
|
+
raise ValueError("local receipt owner mismatch")
|
|
422
|
+
for member in members:
|
|
423
|
+
config = json.loads(member[5] or '{}')
|
|
424
|
+
if member[0] != owner and (member[4] == 'tool' or any(config.get(key) is not None for key in ('_branched_from', '_delegate_from'))):
|
|
425
|
+
raise ValueError("explicit child is not a local continuation")
|
|
426
|
+
# Preserve the older user-delete guard over the complete canonical set, including closed ancestors.
|
|
427
|
+
if guarded(conn, delete_targets(conn, requested)):
|
|
428
|
+
raise _ActiveWriteGuard
|
|
429
|
+
try:
|
|
430
|
+
_, result = delete_in_transaction(agent_db, conn, requested, {})
|
|
431
|
+
except RuntimeStoreError as exc:
|
|
432
|
+
if exc.reason in ("session_busy", "unknown_execution"):
|
|
433
|
+
raise _ActiveWriteGuard from exc
|
|
434
|
+
raise
|
|
435
|
+
# Publish cleanup intent before the database commit; a failed manifest rolls back retirement too.
|
|
436
|
+
_write_cleanup_manifest(home, result["deleted_ids"])
|
|
437
|
+
return result["deleted_ids"]
|
|
438
|
+
|
|
439
|
+
deleted_ids = agent_db._execute_write(write)
|
|
440
|
+
try:
|
|
441
|
+
collect_retired_media(agent_db)
|
|
442
|
+
except Exception: # noqa: BLE001 - retirement committed; retain its targets for caller cleanup and manifest retry
|
|
443
|
+
log.warning("Failed to collect retired session media", exc_info=True)
|
|
444
|
+
return {"ok": False, "deleted_ids": deleted_ids}
|
|
445
|
+
return {"ok": _process_stale_manifests(home), "deleted_ids": deleted_ids}
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
def _delete_rows(requested: str, include_lineage: bool, home: Path, db_path: Path, guarded) -> dict:
|
|
296
449
|
with closing(sqlite3.connect(str(db_path))) as conn:
|
|
297
450
|
conn.row_factory = sqlite3.Row
|
|
298
451
|
conn.execute("PRAGMA foreign_keys = ON")
|
|
299
452
|
conn.execute("BEGIN IMMEDIATE")
|
|
300
453
|
columns = {row[1] for row in conn.execute("PRAGMA table_info(sessions)").fetchall()}
|
|
301
454
|
if not {"id", "parent_session_id"}.issubset(columns):
|
|
302
|
-
return False
|
|
303
|
-
selected = ["id", "parent_session_id"] + [c if c in columns else f"NULL AS {c}" for c in ("model_config", "source", "end_reason", "started_at", "ended_at")]
|
|
455
|
+
return {"ok": False}
|
|
456
|
+
selected = ["id", "parent_session_id"] + [c if c in columns else f"NULL AS {c}" for c in ("model_config", "source", "session_source", "end_reason", "started_at", "ended_at", "chat_id")]
|
|
304
457
|
rows = conn.execute(f"SELECT {', '.join(selected)} FROM sessions").fetchall()
|
|
305
458
|
records = []
|
|
306
459
|
for row in rows:
|
|
@@ -316,7 +469,8 @@ def _delete_locked(sid: str, home: Path) -> bool:
|
|
|
316
469
|
model_config, known = parsed, True
|
|
317
470
|
records.append({
|
|
318
471
|
"id": row["id"], "parent_id": row["parent_session_id"], "delegate_from": model_config.get("_delegate_from"),
|
|
319
|
-
"branched_from": model_config.get("_branched_from"), "model_config_known": known, "source": row["source"],
|
|
472
|
+
"branched_from": model_config.get("_branched_from"), "model_config_known": known, "source": row["source"], "session_source": row["session_source"],
|
|
473
|
+
"reset_from": model_config.get("_reset_from"), "chat_id": row["chat_id"],
|
|
320
474
|
"end_reason": row["end_reason"], "started_at": row["started_at"], "ended_at": row["ended_at"],
|
|
321
475
|
})
|
|
322
476
|
by_id = {r["id"]: r for r in records}
|
|
@@ -339,82 +493,135 @@ def _delete_locked(sid: str, home: Path) -> bool:
|
|
|
339
493
|
return by_id.get(record["delegate_from"]) or {}
|
|
340
494
|
return by_id.get(record["parent_id"]) or {}
|
|
341
495
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
if delegate_from
|
|
496
|
+
def delegates_of(sid: str) -> list[str]:
|
|
497
|
+
preserved = {r["id"] for r in records if r["id"] != sid and must_preserve(r, lineage_parent(r))}
|
|
498
|
+
while True:
|
|
499
|
+
descendants = {r["id"] for r in records if r["id"] != sid and r["parent_id"] in preserved}
|
|
500
|
+
new_ids = descendants - preserved
|
|
501
|
+
if not new_ids:
|
|
502
|
+
break
|
|
503
|
+
preserved.update(new_ids)
|
|
504
|
+
found, frontier = {sid}, {sid}
|
|
505
|
+
while frontier:
|
|
506
|
+
next_frontier = set()
|
|
507
|
+
for record in records:
|
|
508
|
+
row_id = record["id"]
|
|
509
|
+
if row_id in found or row_id in preserved:
|
|
510
|
+
continue
|
|
511
|
+
parent_id, delegate_from = record["parent_id"], record["delegate_from"]
|
|
512
|
+
if delegate_from not in frontier and parent_id not in frontier:
|
|
513
|
+
continue
|
|
514
|
+
if must_preserve(record, lineage_parent(record)):
|
|
515
|
+
continue
|
|
516
|
+
if delegate_from is not None:
|
|
517
|
+
if delegate_from in frontier:
|
|
518
|
+
next_frontier.add(row_id)
|
|
519
|
+
continue
|
|
520
|
+
if record["source"] != "subagent":
|
|
521
|
+
continue
|
|
522
|
+
if parent_id in frontier and record["model_config_known"]:
|
|
363
523
|
next_frontier.add(row_id)
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
all_removed =
|
|
524
|
+
found.update(next_frontier)
|
|
525
|
+
frontier = next_frontier
|
|
526
|
+
return sorted(found - {sid})
|
|
527
|
+
|
|
528
|
+
# TAL-792: the compression continuations are resolved here, in the delete transaction, so one that a compression
|
|
529
|
+
# finished after the caller looked is guarded and removed too; one transaction removes them all, tip first.
|
|
530
|
+
sids = _compression_lineage(records, requested) if include_lineage else [requested]
|
|
531
|
+
plan = [(sid, delegates_of(sid)) for sid in reversed(sids)]
|
|
532
|
+
all_removed = list(dict.fromkeys(i for sid, delegate_ids in plan for i in (sid, *delegate_ids)))
|
|
533
|
+
if _has_retained_runtime_history(conn, records, all_removed):
|
|
534
|
+
return {"ok": False, "refused": "runtime_history_unsupported"}
|
|
535
|
+
# The Agent's own user-delete guard, checked over every row before any is removed. A live writer's turn lease or
|
|
536
|
+
# compression lock refuses the whole delete; expired or dead-holder guards are reclaimed.
|
|
537
|
+
if guarded(conn, all_removed):
|
|
538
|
+
raise _ActiveWriteGuard
|
|
373
539
|
placeholders = ",".join("?" * len(all_removed))
|
|
374
|
-
for
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
540
|
+
for sid, delegate_ids in plan:
|
|
541
|
+
for child_id in delegate_ids:
|
|
542
|
+
conn.execute("DELETE FROM messages WHERE session_id = ?", (child_id,))
|
|
543
|
+
for child_id in delegate_ids:
|
|
544
|
+
conn.execute("UPDATE sessions SET parent_session_id = NULL WHERE parent_session_id = ?", (child_id,))
|
|
545
|
+
for child_id in delegate_ids:
|
|
546
|
+
conn.execute("DELETE FROM sessions WHERE id = ?", (child_id,))
|
|
547
|
+
conn.execute("UPDATE sessions SET parent_session_id = NULL WHERE parent_session_id = ?", (sid,))
|
|
548
|
+
conn.execute("DELETE FROM messages WHERE session_id = ?", (sid,))
|
|
549
|
+
conn.execute("DELETE FROM sessions WHERE id = ?", (sid,))
|
|
383
550
|
tables = {row[0] for row in conn.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall()}
|
|
384
551
|
for table in ("compression_locks", "session_model_usage", "telegram_dm_topic_bindings"):
|
|
385
552
|
if table in tables:
|
|
386
553
|
conn.execute(f"DELETE FROM {table} WHERE session_id IN ({placeholders})", all_removed)
|
|
387
|
-
sessions_dir = home / "sessions"
|
|
388
|
-
sessions_dir.mkdir(parents=True, exist_ok=True)
|
|
389
|
-
base = f".cleanup_manifest_{uuid.uuid4().hex}"
|
|
390
|
-
manifest, tmp = sessions_dir / f"{base}.json", sessions_dir / f"{base}.tmp"
|
|
391
554
|
try:
|
|
392
|
-
|
|
393
|
-
tmp.rename(manifest)
|
|
555
|
+
_write_cleanup_manifest(home, all_removed)
|
|
394
556
|
except OSError:
|
|
395
557
|
log.warning("Failed to write cleanup manifest", exc_info=True)
|
|
396
|
-
tmp.unlink(missing_ok=True)
|
|
397
558
|
conn.rollback()
|
|
398
|
-
return False
|
|
559
|
+
return {"ok": False}
|
|
399
560
|
conn.commit()
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
561
|
+
return {"ok": _process_stale_manifests(home), "deleted_ids": all_removed}
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
def _has_retained_runtime_history(conn, records: list[dict], removed_ids: list[str]) -> bool:
|
|
565
|
+
"""Read-only downgrade fence, never a replacement for the Agent's retirement/receipt validator."""
|
|
566
|
+
targets = set(removed_ids)
|
|
567
|
+
by_id = {r["id"]: r for r in records}
|
|
568
|
+
# Inspect the logical family, including compressed delegates the legacy plan would detach.
|
|
569
|
+
# This only refuses deletion; the installed Agent remains the sole canonical retirement implementation.
|
|
570
|
+
while True:
|
|
571
|
+
connected = set()
|
|
572
|
+
for child in records:
|
|
573
|
+
parent = by_id.get(child["parent_id"])
|
|
574
|
+
if parent and (child['id'] in targets or parent['id'] in targets):
|
|
575
|
+
# Only markers actually copied from this parent are known to be inherited.
|
|
576
|
+
edge = {**child, **{k: None for k in ('branched_from', 'delegate_from', 'reset_from') if child[k] == parent[k]}}
|
|
577
|
+
if _is_continuation(parent, edge):
|
|
578
|
+
connected.update((parent['id'], child['id']))
|
|
579
|
+
if child['branched_from'] is None and child['reset_from'] is None and (child['delegate_from'] in targets
|
|
580
|
+
or (child['delegate_from'] is None and child['source'] == 'subagent' and child['parent_id'] in targets
|
|
581
|
+
and child['model_config_known'])):
|
|
582
|
+
connected.add(child['id'])
|
|
583
|
+
if connected.issubset(targets):
|
|
584
|
+
break
|
|
585
|
+
targets.update(connected)
|
|
586
|
+
tables = {r[0] for r in conn.execute("SELECT name FROM sqlite_master WHERE type='table'")}
|
|
587
|
+
placeholders = ','.join('?' for _ in targets)
|
|
588
|
+
for table, column in (("session_admissions", "target_session_id"), ("worker_executions", "session_id")):
|
|
589
|
+
if table in tables and conn.execute(f"SELECT 1 FROM {table} WHERE {column} IN ({placeholders}) LIMIT 1", tuple(targets)).fetchone():
|
|
590
|
+
return True
|
|
591
|
+
if 'state_meta' not in tables:
|
|
592
|
+
return False
|
|
593
|
+
# The key and stored chat owner still identify a reset receipt when its JSON is unreadable.
|
|
594
|
+
owners = targets | {r["chat_id"] for r in records if r["id"] in targets and isinstance(r["chat_id"], str)}
|
|
595
|
+
for key, raw in conn.execute("SELECT key,value FROM state_meta WHERE key GLOB 'gateway.*'"):
|
|
596
|
+
if key.startswith('gateway.local_policy.v1:') and key.removeprefix('gateway.local_policy.v1:') in owners:
|
|
597
|
+
return True
|
|
598
|
+
if key.startswith('gateway.retired_session.v1.') and key.removeprefix('gateway.retired_session.v1.') in targets:
|
|
599
|
+
return True
|
|
600
|
+
try:
|
|
601
|
+
receipt = json.loads(raw)
|
|
602
|
+
except (TypeError, ValueError):
|
|
603
|
+
continue
|
|
604
|
+
if not isinstance(receipt, dict):
|
|
605
|
+
continue
|
|
606
|
+
lineage = receipt.get('lineage')
|
|
607
|
+
entry = receipt.get('entry')
|
|
608
|
+
ids = [receipt.get('session_id'), receipt.get('target_session_id'),
|
|
609
|
+
entry.get('session_id') if isinstance(entry, dict) else None,
|
|
610
|
+
*(lineage if isinstance(lineage, list) else [])]
|
|
611
|
+
if any(isinstance(sid, str) and sid in targets for sid in ids):
|
|
612
|
+
return True
|
|
613
|
+
return False
|
|
409
614
|
|
|
410
615
|
|
|
411
|
-
def delete_cli_session(home: Path, sid: str) ->
|
|
616
|
+
def delete_cli_session(home: Path, sid: str, include_lineage: bool = False) -> dict:
|
|
412
617
|
try:
|
|
413
618
|
with _thread_lock(home), _process_lock(home):
|
|
414
|
-
return _delete_locked(sid, home)
|
|
619
|
+
return _delete_locked(sid, home, include_lineage)
|
|
620
|
+
except _ActiveWriteGuard: # the uncommitted transaction rolls back on close: nothing is removed
|
|
621
|
+
return {"ok": False, "refused": "active_turn"}
|
|
415
622
|
except Exception: # noqa: BLE001
|
|
416
623
|
log.warning("Failed to delete CLI session %s from state.db", sid, exc_info=True)
|
|
417
|
-
return False
|
|
624
|
+
return {"ok": False}
|
|
418
625
|
|
|
419
626
|
|
|
420
627
|
def register(registry) -> None:
|
|
@@ -449,4 +656,4 @@ def register(registry) -> None:
|
|
|
449
656
|
sid = _session_id(params)
|
|
450
657
|
if not _is_safe_session_id(sid):
|
|
451
658
|
raise InvalidParams("unsafe session_id")
|
|
452
|
-
return
|
|
659
|
+
return delete_cli_session(profile_home_param(params).resolve(), sid, params.get("include_compression_lineage") is True)
|