@maudecode/talaria-web 1.18.0 → 1.20.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 +93 -38
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +99 -17
- package/dist/api/automation-router.js +22 -14
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1433 -37
- package/dist/api/chat-router.js +205 -90
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +6 -2
- package/dist/api/git-router.js +30 -30
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +3 -3
- package/dist/api/raw-routes.js +76 -62
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +5 -5
- 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 +2635 -151
- package/dist/api/sessions-router.js +193 -177
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +450 -11
- package/dist/api/settings-router.js +102 -49
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +2 -2
- package/dist/api/sse-routes.js +102 -80
- 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 +963 -109
- package/dist/api/tools-router.js +426 -72
- 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 +80 -57
- package/dist/app.js.map +1 -1
- package/dist/auth/crypto.d.ts +3 -0
- package/dist/auth/crypto.js +18 -0
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/gate.js +14 -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 +8 -2
- 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 +90 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/supervise.d.ts +24 -0
- package/dist/cli/supervise.js +147 -6
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +37 -11
- package/dist/config/agent-config.js +146 -64
- 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 +4 -0
- package/dist/fs/atomic.js +19 -2
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +7 -0
- package/dist/fs/stat.js +27 -0
- package/dist/fs/stat.js.map +1 -0
- package/dist/http/context.d.ts +28 -9
- package/dist/http/context.js +77 -25
- 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 +12 -4
- package/dist/profiles/profiles.js +78 -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 +85 -14
- package/dist/providers/catalog.js +502 -146
- 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 +56 -23
- package/dist/redact.js.map +1 -1
- package/dist/release.d.ts +7 -0
- package/dist/release.js +19 -3
- package/dist/release.js.map +1 -1
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.js +303 -96
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +31 -18
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +11 -4
- package/dist/sessions/anchor.js +33 -37
- 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 +49 -23
- package/dist/sessions/background-tasks.js +161 -89
- 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 +23 -6
- package/dist/sessions/cli-sessions.js +84 -84
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +38 -2
- package/dist/sessions/completions.js +348 -77
- 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/export.d.ts +2 -0
- package/dist/sessions/export.js +6 -2
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +86 -0
- package/dist/sessions/gateway-sessions.js +914 -0
- package/dist/sessions/gateway-sessions.js.map +1 -0
- package/dist/sessions/gateway-watcher.d.ts +10 -11
- package/dist/sessions/gateway-watcher.js +25 -21
- package/dist/sessions/gateway-watcher.js.map +1 -1
- 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 +34 -18
- package/dist/sessions/list.js +161 -147
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +77 -13
- package/dist/sessions/merge.js +315 -65
- 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 +85 -0
- package/dist/sessions/prefix-index.js +243 -0
- package/dist/sessions/prefix-index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +4 -7
- package/dist/sessions/recovery.js +100 -283
- 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 +251 -78
- package/dist/sessions/service.js +1510 -564
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +20 -2
- package/dist/sessions/session.js +33 -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 +24 -5
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +157 -21
- package/dist/sessions/state-db.js +1145 -204
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/state-saved.d.ts +1 -1
- package/dist/sessions/state-saved.js +35 -11
- package/dist/sessions/state-saved.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +171 -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 +25 -0
- package/dist/sessions/storage/json-documents.js +277 -0
- package/dist/sessions/storage/json-documents.js.map +1 -0
- package/dist/sessions/storage/json-files.d.ts +23 -0
- package/dist/sessions/storage/json-files.js +244 -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 +113 -0
- package/dist/sessions/storage/json-journal.js +756 -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 +82 -0
- package/dist/sessions/storage/json.js +350 -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 +67 -73
- package/dist/sessions/store.js +341 -607
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +12 -7
- package/dist/sessions/streams.js +58 -15
- 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 +8 -5
- package/dist/sessions/tool-display.js +28 -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 +13 -6
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +110 -22
- package/dist/sessions/turn.js +918 -380
- 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 +41 -4
- package/dist/sidecar/client.js +192 -42
- 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.d.ts +6 -2
- package/dist/sidecar/fake.js +34 -4
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/spa.d.ts +9 -4
- package/dist/spa.js +36 -12
- package/dist/spa.js.map +1 -1
- package/dist/startup-timing.d.ts +66 -0
- package/dist/startup-timing.js +129 -0
- package/dist/startup-timing.js.map +1 -0
- 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/fs-handles.d.ts +11 -0
- package/dist/test/fs-handles.js +31 -0
- package/dist/test/fs-handles.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 +46 -5
- package/dist/tools/crons.js +100 -26
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +34 -5
- package/dist/tools/dashboard-plugins.js +146 -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 +82 -0
- package/dist/tools/gateway-restart.js +222 -0
- package/dist/tools/gateway-restart.js.map +1 -0
- package/dist/tools/health.d.ts +28 -4
- package/dist/tools/health.js +171 -50
- 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/insights.d.ts +1 -1
- package/dist/tools/insights.js +2 -2
- package/dist/tools/insights.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/mcp-health.js +74 -24
- package/dist/tools/mcp-health.js.map +1 -1
- package/dist/tools/mcp.js +19 -1
- package/dist/tools/mcp.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-oauth.d.ts +14 -0
- package/dist/tools/plugin-oauth.js +53 -0
- package/dist/tools/plugin-oauth.js.map +1 -0
- 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/prune-advice.d.ts +50 -0
- package/dist/tools/prune-advice.js +114 -0
- package/dist/tools/prune-advice.js.map +1 -0
- package/dist/tools/skills.d.ts +13 -5
- package/dist/tools/skills.js +53 -19
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +102 -17
- package/dist/tools/update-notifications.js +400 -82
- 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 +100 -33
- package/dist/tools/updates.js +1085 -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 +98 -38
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/preview.js +4 -14
- package/dist/workspace/preview.js.map +1 -1
- package/dist/workspace/rollback.d.ts +8 -4
- package/dist/workspace/rollback.js +22 -12
- 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 +6 -4
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +29 -0
- package/sidecar/scripts/record-fixtures.py +12 -3
- package/sidecar/scripts/replay_sidecar.py +8 -0
- package/sidecar/scripts/suite_runner.py +458 -0
- package/sidecar/scripts/test.sh +11 -5
- package/sidecar/talaria_sidecar/__init__.py +6 -1
- package/sidecar/talaria_sidecar/__main__.py +13 -4
- package/sidecar/talaria_sidecar/agent_mutation.py +1111 -0
- package/sidecar/talaria_sidecar/agent_services.py +1116 -0
- package/sidecar/talaria_sidecar/context_detail.py +59 -0
- package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
- package/sidecar/talaria_sidecar/home.py +133 -14
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +211 -41
- package/sidecar/talaria_sidecar/methods/chat.py +1378 -200
- package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
- package/sidecar/talaria_sidecar/methods/commands.py +483 -13
- package/sidecar/talaria_sidecar/methods/config.py +195 -6
- package/sidecar/talaria_sidecar/methods/connectors.py +375 -0
- package/sidecar/talaria_sidecar/methods/cron.py +374 -36
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +215 -55
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +418 -0
- package/sidecar/talaria_sidecar/methods/goals.py +81 -41
- package/sidecar/talaria_sidecar/methods/kanban.py +82 -30
- package/sidecar/talaria_sidecar/methods/memory.py +84 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +144 -13
- package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
- package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
- package/sidecar/talaria_sidecar/methods/process.py +229 -16
- package/sidecar/talaria_sidecar/methods/profiles.py +48 -9
- package/sidecar/talaria_sidecar/methods/providers.py +196 -26
- package/sidecar/talaria_sidecar/methods/runtime.py +71 -1
- package/sidecar/talaria_sidecar/methods/skills.py +83 -5
- package/sidecar/talaria_sidecar/methods/state_db.py +405 -112
- 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 +51 -0
- package/sidecar/talaria_sidecar/methods/usage.py +113 -14
- package/sidecar/talaria_sidecar/methods/worktree.py +145 -19
- package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
- package/sidecar/talaria_sidecar/rpc.py +70 -7
- package/sidecar/talaria_sidecar/runtime.py +122 -14
- package/sidecar/talaria_sidecar/speed.py +47 -0
- package/sidecar/talaria_sidecar/startup_timing.py +119 -0
- package/static/dist/FILES.txt +242 -215
- package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
- package/static/dist/assets/AppShell-3isgvoro.js +8 -0
- package/static/dist/assets/Button-f4n6dapf.js +1 -0
- package/static/dist/assets/ChatPage-k7b6xfax.js +4 -0
- package/static/dist/assets/ConnectTargets-juqvt5lm.js +1 -0
- package/static/dist/assets/Dialog-hta5utr3.js +1 -0
- package/static/dist/assets/ExtensionRoute-zrhjn0wm.js +1 -0
- package/static/dist/assets/Field-b6ez48oz.js +1 -0
- package/static/dist/assets/HubRoute-iwvso2tz.js +2 -0
- package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
- package/static/dist/assets/Markdown-jdeth7zq.js +2 -0
- package/static/dist/assets/MarkdownRenderer-fbswsgld.js +302 -0
- package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
- package/static/dist/assets/OAuthSignIn-bpd8hom3.js +1 -0
- package/static/dist/assets/ResourceSwitch-odi6dy2o.js +1 -0
- package/static/dist/assets/RightPanel-eu6enlo6.js +1 -0
- package/static/dist/assets/Select-kr07928w.js +1 -0
- package/static/dist/assets/SessionListPanel-etb2i54l.js +1 -0
- package/static/dist/assets/SettingsLayout-eu3xxp23.js +1 -0
- package/static/dist/assets/States-icab19yg.js +1 -0
- package/static/dist/assets/TerminalPanel-hngmsr8b.js +16 -0
- package/static/dist/assets/Toaster-nb2uzjw1.js +1 -0
- package/static/dist/assets/_app-ga1moszl.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-na62087t.js +1 -0
- package/static/dist/assets/_app.index-jypgdqoi.js +1 -0
- package/static/dist/assets/_app.insights-kabejdtm.js +1 -0
- package/static/dist/assets/_app.kanban-m19kfcmx.js +1 -0
- package/static/dist/assets/_app.logs-iw4m96sz.js +1 -0
- package/static/dist/assets/_app.memory-jq5frwcg.js +1 -0
- package/static/dist/assets/_app.profiles-kwa3m7rp.js +1 -0
- package/static/dist/assets/_app.session._sessionId-o5lyeipj.js +1 -0
- package/static/dist/assets/_app.settings-ckl8hdll.js +1 -0
- package/static/dist/assets/_app.settings._section-dtdjk98a.js +3 -0
- package/static/dist/assets/_app.skills-n016rihd.js +1 -0
- package/static/dist/assets/_app.tasks-n8zuqsqe.js +1 -0
- package/static/dist/assets/_app.todos-btew5v2s.js +1 -0
- package/static/dist/assets/_app.workspaces-lnfk95ch.js +1 -0
- package/static/dist/assets/abnfDiagram-VCTEODGH-dttheegb.js +1 -0
- package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
- package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
- package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
- package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-ic435919.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-8r3glgiq.js +36 -0
- package/static/dist/assets/archive-il7c6053.js +1 -0
- package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
- package/static/dist/assets/back-gu3nu279.js +1 -0
- package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-jenyos6c.js} +4 -4
- package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-nzlx7yc4.js} +1 -1
- package/static/dist/assets/cancel-bsnfo36u.js +1 -0
- package/static/dist/assets/channel-dsbtk01y.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-g0cru63b.js} +20 -20
- package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-7rkswkjw.js} +1 -1
- package/static/dist/assets/chunk-DU6HZSFF-fn73jzdo.js +128 -0
- package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-oey8e72m.js} +1 -1
- package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
- package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-l2a32wiy.js} +6 -6
- package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-o9dwzh8h.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-eblwj20b.js} +5 -5
- package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-o2mufspb.js} +1 -1
- package/static/dist/assets/chunk-OSK3NFVY-ijp9pw29.js +10 -0
- package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-hs9hqwl4.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-bp9rsqez.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-brkprov6.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-gmpv0pxz.js} +13 -13
- package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-oldm08fu.js} +4 -4
- package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-ooqilfv7.js} +6 -6
- package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +1 -0
- package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
- package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
- package/static/dist/assets/copied-bz3gkazh.js +1 -0
- package/static/dist/assets/copy-jo006coq.js +1 -0
- package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
- package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
- package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
- package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
- package/static/dist/assets/cynefin-OW5HDTMX-d47op7qs.js +1 -0
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-doa7594y.js +62 -0
- package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
- package/static/dist/assets/dagre-GXQ25YYZ-os768dp4.js +4 -0
- package/static/dist/assets/dagre-o5jmjz46.js +1 -0
- package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-fyi81nxd.js} +4 -4
- package/static/dist/assets/diagram-UQ7AKVKN-j3exggaq.js +41 -0
- package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-omo1en2l.js} +1 -1
- package/static/dist/assets/diagram-VX7I27RA-oro2cyu0.js +24 -0
- package/static/dist/assets/diagram-Z3DM3KII-byt9vdb7.js +24 -0
- package/static/dist/assets/dist-crc46di9.js +7 -0
- package/static/dist/assets/dist-etpoyscq.js +44 -0
- package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
- package/static/dist/assets/ebnfDiagram-PWID7BFC-ee3haugh.js +1 -0
- package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
- package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
- package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
- package/static/dist/assets/erDiagram-RLTQ6QDP-d1e93yff.js +99 -0
- package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-i1ihb40c.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +1 -0
- package/static/dist/assets/folder-plus-ivoglq98.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-m7g0jud4.js} +1 -1
- package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-hzdj07yy.js +1 -0
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-dm9agbna.js} +1 -1
- package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
- package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
- package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
- package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
- package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
- package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
- package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-mmgz2czu.js +1 -0
- package/static/dist/assets/host-fr6lni1p.js +1 -0
- package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
- package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
- package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
- package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
- package/static/dist/assets/index-73649w7o.js +10 -0
- package/static/dist/assets/index-lhf1fsdf.css +2 -0
- package/static/dist/assets/info-A6RAGUB7-lll1dqmm.js +1 -0
- package/static/dist/assets/infoDiagram-27XIBGKW-k7esc639.js +2 -0
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-lgr6k9wo.js} +6 -6
- package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
- package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
- package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
- package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-ndmbxuqk.js} +1 -1
- package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
- package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
- package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
- package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
- package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-mjxym0jp.js} +28 -28
- package/static/dist/assets/katex-cbdd1ohw.css +1 -0
- package/static/dist/assets/katex-pbij2oo6.js +257 -0
- package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-cwb6l7xh.js +1 -0
- package/static/dist/assets/{line-meizqsvn.js → line-mtr5k6il.js} +1 -1
- package/static/dist/assets/linear-jlwrvvy6.js +1 -0
- package/static/dist/assets/link-iadw4ghw.js +2 -0
- package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
- package/static/dist/assets/locale-cs-n41hptse.js +5 -0
- package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
- package/static/dist/assets/locale-es-ih078lco.js +5 -0
- package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
- package/static/dist/assets/locale-it-kb96jufy.js +5 -0
- package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
- package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
- package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
- package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
- package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
- package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
- package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
- package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
- package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
- package/static/dist/assets/login-lkhtzfcl.js +1 -0
- package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
- package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
- package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +1 -0
- package/static/dist/assets/mermaid-parser.core-k91vdnvi.js +7 -0
- package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-ehztfea4.js} +28 -28
- package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
- package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
- package/static/dist/assets/onboarding-f67z0a2r.js +1 -0
- package/static/dist/assets/packet-AYTQ26CC-ok2xrblz.js +1 -0
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/pegDiagram-XKGWAZYB-ec3rpj0m.js +1 -0
- package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
- package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
- package/static/dist/assets/pie-WAS4IAKB-iwkir23u.js +1 -0
- package/static/dist/assets/pieDiagram-E7YTZNPT-fcpqpekh.js +39 -0
- package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
- package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-lqsync43.js} +1 -1
- package/static/dist/assets/queryKeys-ed4n2egc.js +9 -0
- package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
- package/static/dist/assets/radar-RG4KPBEZ-hje4jbk6.js +1 -0
- package/static/dist/assets/railroad-74A4TZTK-gll9n6qi.js +1 -0
- package/static/dist/assets/railroad-abnf-HS5TGJTU-o6h6lpn4.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-juaefj6o.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-cgfhvpah.js +1 -0
- package/static/dist/assets/railroadDiagram-O6MQD6OU-lp3w7awf.js +1 -0
- package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
- package/static/dist/assets/refresh-cw-iccm7a4e.js +1 -0
- package/static/dist/assets/refresh-i9ya9dvl.js +1 -0
- package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
- package/static/dist/assets/registry-g7w3353u.js +1 -0
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ha8eibcf.js +84 -0
- package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
- package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
- package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
- package/static/dist/assets/runtime-nlxpnegr.js +1 -0
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-oxf31pr9.js} +1 -1
- package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
- package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-jiq8lhyo.js} +11 -11
- package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
- package/static/dist/assets/share._token-o76ki0ly.js +2 -0
- package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
- package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
- package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
- package/static/dist/assets/sliders-horizontal-ddcs88av.js +1 -0
- package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
- package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
- package/static/dist/assets/src-h89s0hs4.js +1 -0
- package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-f3fslnon.js +1 -0
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +1 -0
- package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
- package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
- package/static/dist/assets/swimlanes-42K2YHIH-k1hmk7jf.js +1 -0
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +8 -0
- package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
- package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
- package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-n3ncfy9r.js} +8 -8
- package/static/dist/assets/toast-liparz2j.js +56 -0
- package/static/dist/assets/treeView-Q6P3EWNA-l3y2pejt.js +1 -0
- package/static/dist/assets/treemap-WGGIJYW6-jown9axh.js +1 -0
- package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
- package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
- package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
- package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
- package/static/dist/assets/untitled-mj86r4gz.js +1 -0
- package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
- package/static/dist/assets/useForm-o4uu74mx.js +1 -0
- package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-ftsveu84.js} +1 -1
- package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-crqueqga.js} +1 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-dh59uq1c.js +34 -0
- package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
- package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
- package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
- package/static/dist/assets/wardley-WFR3VGLG-e6d74b0j.js +1 -0
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hnofh78f.js +78 -0
- package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
- package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
- package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-bpymjelb.js} +6 -6
- package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
- package/static/dist/extension-sdk.js +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +180 -136
- 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/Markdown-lwviulmg.css +0 -1
- 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.ext._extensionId-gfbzpoou.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.session._sessionId-fn1bhde6.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/abnfDiagram-VCTEODGH-c8kdixke.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
- package/static/dist/assets/architectureDiagram-5GKGNRK7-cku06x1p.js +0 -36
- 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/chunk-DU6HZSFF-ofajdixh.js +0 -128
- package/static/dist/assets/chunk-OSK3NFVY-e7gkikcw.js +0 -10
- 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/copy-magtofyp.js +0 -1
- package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
- package/static/dist/assets/cynefin-OW5HDTMX-siqlulkl.js +0 -1
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-i648tah9.js +0 -62
- package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
- package/static/dist/assets/dagre-GXQ25YYZ-mwn6uc17.js +0 -4
- package/static/dist/assets/dagre-lkoknbjn.js +0 -1
- package/static/dist/assets/diagram-UQ7AKVKN-mekq7zgq.js +0 -41
- package/static/dist/assets/diagram-VX7I27RA-xe6r5qfw.js +0 -24
- package/static/dist/assets/diagram-Z3DM3KII-nq07dg7k.js +0 -24
- package/static/dist/assets/ebnfDiagram-PWID7BFC-c62ipm3g.js +0 -1
- package/static/dist/assets/endpoints-klbxod4t.js +0 -64
- package/static/dist/assets/erDiagram-RLTQ6QDP-h39kmnzy.js +0 -99
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-fr2i7caa.js +0 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-jwpop9p8.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/info-A6RAGUB7-h11x0dxo.js +0 -1
- package/static/dist/assets/infoDiagram-27XIBGKW-dfh47dw9.js +0 -2
- package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
- package/static/dist/assets/linear-becwlnhk.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/mermaid-parser.core-ntne45i9.js +0 -7
- package/static/dist/assets/not-found-ccnnac39.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/packet-AYTQ26CC-l6jdka8p.js +0 -1
- package/static/dist/assets/pegDiagram-XKGWAZYB-g1er3bxj.js +0 -1
- package/static/dist/assets/pie-WAS4IAKB-i0ylcrt9.js +0 -1
- package/static/dist/assets/pieDiagram-E7YTZNPT-fbz1e55z.js +0 -39
- package/static/dist/assets/radar-RG4KPBEZ-f9b70aa4.js +0 -1
- package/static/dist/assets/railroad-74A4TZTK-lgsuoeda.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/railroadDiagram-O6MQD6OU-eqpy9fnz.js +0 -1
- package/static/dist/assets/refresh-abtu93ke.js +0 -1
- package/static/dist/assets/refresh-cw-hlwb02qv.js +0 -1
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ogf6puhi.js +0 -84
- package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
- package/static/dist/assets/root-mbklpuv4.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/sizeCapture-INFHLROL-g612l48j.js +0 -1
- package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
- package/static/dist/assets/src-hjyib4mu.js +0 -1
- package/static/dist/assets/sse-iwku0sjo.js +0 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-fyoznpcs.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
- package/static/dist/assets/swimlanes-42K2YHIH-oefldhfy.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/treeView-Q6P3EWNA-f7hcci5o.js +0 -1
- package/static/dist/assets/treemap-WGGIJYW6-nl85071a.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
- package/static/dist/assets/vennDiagram-4TSXK5OY-h5hzbk0n.js +0 -34
- package/static/dist/assets/wardley-WFR3VGLG-jftvpm3e.js +0 -1
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hedh85ge.js +0 -78
- /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session recovery audit and safe repair (Python `api/session_recovery.py`, TAL-259). The store writes
|
|
3
|
-
*
|
|
3
|
+
* a shrink backup before any save that shrinks a transcript; the audit classifies every backup, index row, WebUI-origin
|
|
4
4
|
* state.db row without a sidecar, and pending turn-journal entry as `repairable` or `unsafe_to_repair`, and safe repair
|
|
5
5
|
* restores, materializes, and reindexes only what is repairable.
|
|
6
6
|
*
|
|
@@ -9,141 +9,42 @@
|
|
|
9
9
|
* `recovery_stamping_since` marker may predate that provenance, so next to a readable live transcript it goes to manual
|
|
10
10
|
* review instead.
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
14
|
+
import { updateDocument } from './storage/document.js';
|
|
15
15
|
import { str } from '../util.js';
|
|
16
|
-
import { isContextCompressionMarker } from './merge.js';
|
|
17
16
|
import { isSafeSessionId, Session } from './session.js';
|
|
18
|
-
import { normalizeAgentSessionSource
|
|
19
|
-
const STAMPING_MARKER = 'recovery_stamping_since';
|
|
17
|
+
import { normalizeAgentSessionSource } from './state-db.js';
|
|
20
18
|
/** Python `STATE_DB_RECOVERY_BUSY_TIMEOUT_MS`: a recovery scan waits out a writer rather than read a lock as "nothing missing". */
|
|
21
19
|
const STATE_DB_RECOVERY_BUSY_TIMEOUT_MS = 5000;
|
|
22
|
-
const SHRINK_GENERATION_RE = /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/;
|
|
23
|
-
const TURN_JOURNAL_DIR = '_turn_journal';
|
|
24
|
-
const TURN_JOURNAL_ID_RE = /^[A-Za-z0-9_.-]+$/;
|
|
25
20
|
const TERMINAL_TURN_EVENTS = new Set(['completed', 'interrupted']);
|
|
21
|
+
const createdAt = (event) => { const value = Number(event.created_at ?? 0); return Number.isFinite(value) ? value : 0; };
|
|
26
22
|
const WORKTREE_FIELDS = ['worktree_path', 'worktree_branch', 'worktree_repo_root', 'worktree_created_at'];
|
|
27
|
-
let tmpCounter = 0;
|
|
28
23
|
const isDict = (v) => Boolean(v) && typeof v === 'object' && !Array.isArray(v);
|
|
29
|
-
const isEmptyList = (v) => Array.isArray(v) && v.length === 0;
|
|
30
24
|
/**
|
|
31
25
|
* Epoch seconds since which this server stamps every deliberate shrink, recorded in the state directory on first start.
|
|
32
26
|
* A missing or unreadable marker is recorded anew: a later marker only sends more backups to manual review.
|
|
33
27
|
*/
|
|
34
|
-
export function recoveryStampingSince(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const now = Date.now() / 1000;
|
|
43
|
-
mkdirSync(stateDir, { recursive: true });
|
|
44
|
-
atomicWriteText(path, `${String(now)}\n`);
|
|
45
|
-
return now;
|
|
46
|
-
}
|
|
47
|
-
function readDoc(path) {
|
|
48
|
-
try {
|
|
49
|
-
const value = JSON.parse(readFileSync(path, 'utf8'));
|
|
50
|
-
return isDict(value) ? value : null;
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/** Python `_msg_count`: the transcript length, or -1 when the file is missing, unparseable, or not a session. */
|
|
57
|
-
function messageCount(doc) {
|
|
58
|
-
return doc && Array.isArray(doc.messages) ? doc.messages.length : -1;
|
|
59
|
-
}
|
|
60
|
-
// ── deliberate-shrink provenance ─────────────────────────────────────────
|
|
61
|
-
/**
|
|
62
|
-
* Python `_session_records_clear_sentinel` / `_live_supersedes_backup_by_clear_generation`: the live sidecar carries a
|
|
63
|
-
* clear generation the backup lacks and the clear's boundary reset, and is either the exact cleared shape or has new
|
|
64
|
-
* messages since.
|
|
65
|
-
*/
|
|
66
|
-
function clearedAfterBackup(live, bak) {
|
|
67
|
-
const generation = live.clear_generation;
|
|
68
|
-
if (typeof generation !== 'string' || !generation || bak.clear_generation === generation)
|
|
69
|
-
return false;
|
|
70
|
-
if (live.truncation_watermark !== 0 || live.truncation_boundary !== 0)
|
|
71
|
-
return false;
|
|
72
|
-
if (Array.isArray(live.messages) && live.messages.length > 0)
|
|
73
|
-
return true;
|
|
74
|
-
const nulls = ['active_stream_id', 'pending_user_message', 'pending_started_at', 'pending_user_source'];
|
|
75
|
-
const lists = ['messages', 'context_messages', 'pending_attachments'];
|
|
76
|
-
return nulls.every((k) => k in live && live[k] === null) && lists.every((k) => isEmptyList(live[k]));
|
|
77
|
-
}
|
|
78
|
-
/** Python `_session_records_intentional_compress_shrink`: the live sidecar records a context compression. */
|
|
79
|
-
function recordsCompression(live) {
|
|
80
|
-
if (str(live.compression_anchor_mode).trim().toLowerCase() === 'manual')
|
|
81
|
-
return true;
|
|
82
|
-
const shorter = Array.isArray(live.context_messages) && Array.isArray(live.messages) && live.context_messages.length < live.messages.length;
|
|
83
|
-
if (!shorter)
|
|
84
|
-
return false;
|
|
85
|
-
const anchored = str(live.compression_anchor_summary).trim() !== '' && live.compression_anchor_message_key !== null && live.compression_anchor_message_key !== undefined;
|
|
86
|
-
return anchored || (live.truncation_watermark !== null && live.truncation_watermark !== undefined);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Python `_backup_predates_intentional_shrink`: the backup still holds the uncompressed context. A backup whose context
|
|
90
|
-
* carries the compaction marker was written after the compression and stays recoverable.
|
|
91
|
-
*/
|
|
92
|
-
function backupPredatesCompression(live, bak) {
|
|
93
|
-
const bakContext = Array.isArray(bak.context_messages) ? bak.context_messages : [];
|
|
94
|
-
if (bakContext.some(isContextCompressionMarker))
|
|
95
|
-
return false;
|
|
96
|
-
return bakContext.length > (Array.isArray(live.context_messages) ? live.context_messages.length : 0);
|
|
97
|
-
}
|
|
98
|
-
/** Python `_session_records_intentional_message_shrink`: truncate, retry, or undo stamped a generation the backup lacks. */
|
|
99
|
-
function recordsMessageShrink(live, bak) {
|
|
100
|
-
const isGeneration = (v) => typeof v === 'string' && SHRINK_GENERATION_RE.test(v);
|
|
101
|
-
if (!isGeneration(live.intentional_shrink_generation))
|
|
102
|
-
return false;
|
|
103
|
-
const backup = bak.intentional_shrink_generation;
|
|
104
|
-
if (backup === undefined || backup === null)
|
|
105
|
-
return true;
|
|
106
|
-
return isGeneration(backup) && backup !== live.intentional_shrink_generation;
|
|
107
|
-
}
|
|
108
|
-
/** Python `inspect_session_recovery_status`: whether `<sid>.json.bak` should replace `<sid>.json`. */
|
|
109
|
-
function inspectBackup(dir, sid, stampingSince) {
|
|
110
|
-
const livePath = join(dir, `${sid}.json`);
|
|
111
|
-
let bakMtime;
|
|
112
|
-
try {
|
|
113
|
-
bakMtime = statSync(`${livePath}.bak`).mtimeMs / 1000;
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
return { session_id: sid, live_messages: messageCount(readDoc(livePath)), bak_messages: -1, recommend: 'no_backup' };
|
|
117
|
-
}
|
|
118
|
-
const live = readDoc(livePath);
|
|
119
|
-
const bak = readDoc(`${livePath}.bak`);
|
|
120
|
-
const base = { session_id: sid, live_messages: messageCount(live), bak_messages: messageCount(bak) };
|
|
121
|
-
if (base.bak_messages <= base.live_messages)
|
|
122
|
-
return { ...base, recommend: 'no_action' };
|
|
123
|
-
// Every guard needs both documents; an unreadable live file is a real loss and restores.
|
|
124
|
-
if (live && bak) {
|
|
125
|
-
if (clearedAfterBackup(live, bak))
|
|
126
|
-
return { ...base, recommend: 'no_action', reason: 'intentional_clear_truncate' };
|
|
127
|
-
if (recordsCompression(live) && backupPredatesCompression(live, bak))
|
|
128
|
-
return { ...base, recommend: 'no_action', reason: 'intentional_compress_shrink' };
|
|
129
|
-
if (recordsMessageShrink(live, bak))
|
|
130
|
-
return { ...base, recommend: 'no_action', reason: 'intentional_message_shrink' };
|
|
131
|
-
if (base.live_messages >= 0 && bakMtime < stampingSince)
|
|
132
|
-
return { ...base, recommend: 'manual_review', reason: 'unstamped_legacy_backup' };
|
|
133
|
-
}
|
|
134
|
-
return { ...base, recommend: 'restore' };
|
|
28
|
+
export async function recoveryStampingSince(documents) {
|
|
29
|
+
return (await updateDocument(documents, 'recovery', 'stamping-since', (value) => {
|
|
30
|
+
const stored = Number(typeof value === 'string' ? value.trim() : '');
|
|
31
|
+
if (Number.isFinite(stored) && stored > 0)
|
|
32
|
+
return { value, result: stored };
|
|
33
|
+
const now = Date.now() / 1000;
|
|
34
|
+
return { value: `${String(now)}\n`, result: now };
|
|
35
|
+
}, { replaceInvalid: true }));
|
|
135
36
|
}
|
|
136
37
|
function columns(db, table) {
|
|
137
38
|
return new Set(db.prepare(`PRAGMA table_info(${table})`).all().map((r) => r.name));
|
|
138
39
|
}
|
|
139
40
|
/** Python `_read_state_db_missing_sidecar_rows` (with empty rows) plus the session ids, from one read-only handle. */
|
|
140
|
-
function readStateDb(path,
|
|
41
|
+
function readStateDb(path, persisted) {
|
|
141
42
|
const absent = { has: () => true, missing: [], unreadable: false };
|
|
142
43
|
if (!existsSync(path))
|
|
143
44
|
return absent;
|
|
144
45
|
let db;
|
|
145
46
|
try {
|
|
146
|
-
db =
|
|
47
|
+
db = new DatabaseSync(path, { readOnly: true, timeout: STATE_DB_RECOVERY_BUSY_TIMEOUT_MS });
|
|
147
48
|
}
|
|
148
49
|
catch {
|
|
149
50
|
return { ...absent, unreadable: true };
|
|
@@ -166,7 +67,7 @@ function readStateDb(path, sessionDir) {
|
|
|
166
67
|
: null;
|
|
167
68
|
for (const row of rows) {
|
|
168
69
|
const sid = str(row.id).trim();
|
|
169
|
-
if (!isSafeSessionId(sid) ||
|
|
70
|
+
if (!isSafeSessionId(sid) || persisted.has(sid))
|
|
170
71
|
continue;
|
|
171
72
|
const transcript = (messages?.all(sid) ?? []).map((m) => ({ role: m.role, content: m.content || '', ...(m.timestamp !== null ? { timestamp: m.timestamp } : {}) }));
|
|
172
73
|
view.missing.push({ ...row, id: sid, messages: transcript });
|
|
@@ -181,7 +82,7 @@ function readStateDb(path, sessionDir) {
|
|
|
181
82
|
}
|
|
182
83
|
}
|
|
183
84
|
/** Python `_state_db_row_to_sidecar`, through `Session` so the document matches every field the store persists. */
|
|
184
|
-
function sidecarFromStateDbRow(row, store, profile) {
|
|
85
|
+
async function sidecarFromStateDbRow(row, store, profile) {
|
|
185
86
|
const source = 'webui'; // the scan reads only WebUI-origin rows
|
|
186
87
|
const started = Number(row.started_at) || 0;
|
|
187
88
|
const last = Number(row.messages.at(-1)?.timestamp) || 0;
|
|
@@ -191,60 +92,10 @@ function sidecarFromStateDbRow(row, store, profile) {
|
|
|
191
92
|
session_id: row.id, title: str(row.title) || 'Recovered WebUI Session', ...workspace, model: str(row.model) || 'unknown', profile,
|
|
192
93
|
created_at: started, updated_at: last || started, parent_session_id: row.parent_session_id ?? null, ...worktree,
|
|
193
94
|
source_tag: source, ...normalizeAgentSessionSource(source), messages: row.messages,
|
|
194
|
-
}, store.deps.defaults(profile));
|
|
95
|
+
}, (await store.deps.defaults(profile)));
|
|
195
96
|
return session.toDocument();
|
|
196
97
|
}
|
|
197
98
|
// ── turn journal (read-only) ─────────────────────────────────────────────
|
|
198
|
-
const createdAt = (event) => { const n = Number(event.created_at ?? 0); return Number.isFinite(n) ? n : 0; };
|
|
199
|
-
/**
|
|
200
|
-
* Python `iter_turn_journal_session_ids` + `read_turn_journal`: each session's events across its pid shards
|
|
201
|
-
* (`<sid>~<pid>.jsonl`) and legacy file, oldest first. Only journals an earlier backend left behind exist; this server
|
|
202
|
-
* never writes one.
|
|
203
|
-
*/
|
|
204
|
-
function readTurnJournals(sessionDir) {
|
|
205
|
-
const dir = join(sessionDir, TURN_JOURNAL_DIR);
|
|
206
|
-
const out = new Map();
|
|
207
|
-
let names;
|
|
208
|
-
try {
|
|
209
|
-
names = readdirSync(dir).sort();
|
|
210
|
-
}
|
|
211
|
-
catch {
|
|
212
|
-
return out;
|
|
213
|
-
}
|
|
214
|
-
for (const name of names) {
|
|
215
|
-
if (!name.endsWith('.jsonl'))
|
|
216
|
-
continue;
|
|
217
|
-
const stem = name.slice(0, -'.jsonl'.length);
|
|
218
|
-
const tilde = stem.indexOf('~');
|
|
219
|
-
const sid = tilde > 0 ? stem.slice(0, tilde) : stem;
|
|
220
|
-
if (!TURN_JOURNAL_ID_RE.test(sid))
|
|
221
|
-
continue;
|
|
222
|
-
let text;
|
|
223
|
-
try {
|
|
224
|
-
if (!statSync(join(dir, name)).isFile())
|
|
225
|
-
continue;
|
|
226
|
-
text = readFileSync(join(dir, name), 'utf8');
|
|
227
|
-
}
|
|
228
|
-
catch {
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
const events = out.get(sid) ?? [];
|
|
232
|
-
for (const line of text.split('\n')) {
|
|
233
|
-
if (!line.trim())
|
|
234
|
-
continue;
|
|
235
|
-
try {
|
|
236
|
-
const event = JSON.parse(line);
|
|
237
|
-
if (isDict(event))
|
|
238
|
-
events.push(event);
|
|
239
|
-
}
|
|
240
|
-
catch { /* a torn line */ }
|
|
241
|
-
}
|
|
242
|
-
out.set(sid, events);
|
|
243
|
-
}
|
|
244
|
-
for (const events of out.values())
|
|
245
|
-
events.sort((a, b) => createdAt(a) - createdAt(b));
|
|
246
|
-
return out;
|
|
247
|
-
}
|
|
248
99
|
/** What a turn sent: its trimmed text and attachment names, or null when it sent nothing identifiable. */
|
|
249
100
|
function turnKey(content, attachments) {
|
|
250
101
|
const text = str(content || '').trim();
|
|
@@ -258,7 +109,7 @@ const TURN_ROW_CLOCK_SLACK_S = 5;
|
|
|
258
109
|
* turn's id (or stream id) is that turn; otherwise rows and turns with the same text and attachments pair up in order,
|
|
259
110
|
* one row per turn, so a repeated message ("continue") or an attachment-only turn still counts as missing.
|
|
260
111
|
*/
|
|
261
|
-
function pendingJournalTurns(
|
|
112
|
+
function pendingJournalTurns(live, sid, events) {
|
|
262
113
|
const turns = new Map();
|
|
263
114
|
for (const event of events) {
|
|
264
115
|
const id = str(event.turn_id).trim();
|
|
@@ -275,7 +126,6 @@ function pendingJournalTurns(sessionDir, sid, events) {
|
|
|
275
126
|
}
|
|
276
127
|
if (!turns.size)
|
|
277
128
|
return [];
|
|
278
|
-
const live = readDoc(join(sessionDir, `${sid}.json`));
|
|
279
129
|
const rows = (Array.isArray(live?.messages) ? live.messages : []).filter((m) => isDict(m) && m.role === 'user');
|
|
280
130
|
const rowTurnIds = new Set(rows.map((m) => str(m._turn_id)).filter(Boolean));
|
|
281
131
|
const journaled = new Set([...turns.values()].flatMap((t) => [...t.ids]));
|
|
@@ -294,7 +144,7 @@ function pendingJournalTurns(sessionDir, sid, events) {
|
|
|
294
144
|
for (const turn of [...missing].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))) {
|
|
295
145
|
if (TERMINAL_TURN_EVENTS.has(str(turn.latest.event)))
|
|
296
146
|
continue;
|
|
297
|
-
items.push({ ...item(sid, 'turn_journal_pending_turn', 'repairable', 'audit_only_pending_turn_journal',
|
|
147
|
+
items.push({ ...item(sid, 'turn_journal_pending_turn', 'repairable', 'audit_only_pending_turn_journal', Array.isArray(live?.messages) ? live.messages.length : -1), turn_id: turn.id, event: str(turn.latest.event) });
|
|
298
148
|
}
|
|
299
149
|
return items;
|
|
300
150
|
}
|
|
@@ -302,57 +152,51 @@ function pendingJournalTurns(sessionDir, sid, events) {
|
|
|
302
152
|
function item(session_id, kind, category, recommendation, live_messages = -1, bak_messages = -1) {
|
|
303
153
|
return { session_id, kind, category, recommendation, live_messages, bak_messages };
|
|
304
154
|
}
|
|
305
|
-
function scan(deps) {
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
155
|
+
async function scan(deps) {
|
|
156
|
+
const persisted = await deps.store.persistedIds();
|
|
157
|
+
return { liveIds: [...persisted].sort(), issues: await deps.store.diagnose(), db: readStateDb(deps.stateDbPath, persisted), tombstoned: await deps.store.loadDeletedTombstone() };
|
|
158
|
+
}
|
|
159
|
+
async function readOnlyRecovery(deps, sid, profile) {
|
|
160
|
+
if (profile === undefined) {
|
|
161
|
+
try {
|
|
162
|
+
profile = (await deps.store.loadMetadataOnly(sid))?.profile ?? deps.profile;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
profile = deps.profile;
|
|
166
|
+
}
|
|
310
167
|
}
|
|
311
|
-
|
|
312
|
-
const ids = (suffix) => names.filter((n) => n.endsWith(suffix) && !n.startsWith('_')).map((n) => n.slice(0, -suffix.length));
|
|
313
|
-
return { dir, liveIds: ids('.json'), backupIds: ids('.json.bak'), db: readStateDb(deps.stateDbPath, dir), tombstoned: deps.store.loadDeletedTombstone() };
|
|
168
|
+
return await deps.isReadOnly(sid, profile);
|
|
314
169
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
const s = scan(deps);
|
|
170
|
+
export async function auditSessionRecovery(deps) {
|
|
171
|
+
const s = await scan(deps);
|
|
318
172
|
const items = [];
|
|
319
|
-
const live = new Set(s.liveIds);
|
|
320
|
-
for (const sid of s.backupIds.filter((id) => live.has(id))) {
|
|
321
|
-
const status = inspectBackup(s.dir, sid, deps.stampingSince);
|
|
322
|
-
if (status.recommend === 'restore')
|
|
323
|
-
items.push(item(sid, 'shrunken_live', 'repairable', 'restore_from_bak', status.live_messages, status.bak_messages));
|
|
324
|
-
if (status.recommend === 'manual_review')
|
|
325
|
-
items.push(item(sid, 'unstamped_legacy_backup', 'unsafe_to_repair', 'manual_review', status.live_messages, status.bak_messages));
|
|
326
|
-
}
|
|
327
|
-
// A deleted session with both a surviving backup and a state.db row is reported once (#5504).
|
|
328
173
|
const reportedDeleted = new Set();
|
|
329
|
-
for (const
|
|
330
|
-
const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
174
|
+
for (const issue of s.issues) {
|
|
175
|
+
const { profile } = issue;
|
|
176
|
+
const finding = { ...issue };
|
|
177
|
+
delete finding.profile;
|
|
178
|
+
delete finding.revision;
|
|
179
|
+
delete finding.backupRevision;
|
|
180
|
+
if (finding.kind === 'index_missing_file' && s.tombstoned.has(finding.session_id))
|
|
181
|
+
continue;
|
|
182
|
+
if (finding.kind === 'orphan_backup') {
|
|
183
|
+
if (s.tombstoned.has(finding.session_id)) {
|
|
184
|
+
reportedDeleted.add(finding.session_id);
|
|
185
|
+
finding.kind = 'state_db_deleted_webui_tombstone';
|
|
186
|
+
finding.category = 'unsafe_to_repair';
|
|
187
|
+
finding.recommendation = 'deleted_session_skipped';
|
|
188
|
+
}
|
|
189
|
+
else if (!s.db.has(finding.session_id)) {
|
|
190
|
+
finding.kind = 'orphan_backup_without_state_row';
|
|
191
|
+
finding.category = 'unsafe_to_repair';
|
|
192
|
+
finding.recommendation = 'manual_review';
|
|
193
|
+
}
|
|
346
194
|
}
|
|
347
|
-
|
|
348
|
-
|
|
195
|
+
if (finding.recommendation === 'restore_from_bak' && await readOnlyRecovery(deps, finding.session_id, profile)) {
|
|
196
|
+
finding.category = 'unsafe_to_repair';
|
|
197
|
+
finding.recommendation = 'manual_review';
|
|
349
198
|
}
|
|
350
|
-
|
|
351
|
-
for (const sid of [...indexed].filter((id) => !live.has(id) && !s.tombstoned.has(id)).sort())
|
|
352
|
-
items.push(item(sid, 'index_missing_file', 'repairable', 'rebuild_index'));
|
|
353
|
-
if (indexed)
|
|
354
|
-
for (const sid of s.liveIds.filter((id) => !indexed.has(id)))
|
|
355
|
-
items.push(item(sid, 'index_missing_entry', 'repairable', 'rebuild_index', messageCount(readDoc(join(s.dir, `${sid}.json`)))));
|
|
199
|
+
items.push(finding);
|
|
356
200
|
}
|
|
357
201
|
for (const row of s.db.missing) {
|
|
358
202
|
if (reportedDeleted.has(row.id))
|
|
@@ -366,72 +210,49 @@ export function auditSessionRecovery(deps) {
|
|
|
366
210
|
}
|
|
367
211
|
if (s.db.unreadable)
|
|
368
212
|
items.push(item('', 'state_db_unreadable', 'unsafe_to_repair', 'manual_review'));
|
|
369
|
-
for (const [sid, events] of
|
|
370
|
-
|
|
371
|
-
const summary = { ok: s.liveIds.length, repairable: 0, unsafe_to_repair: 0 };
|
|
372
|
-
for (const i of items)
|
|
373
|
-
summary[i.category] += 1;
|
|
374
|
-
return { status: summary.unsafe_to_repair ? 'needs_manual_review' : summary.repairable ? 'warn' : 'ok', summary, items };
|
|
375
|
-
}
|
|
376
|
-
// ── repair ───────────────────────────────────────────────────────────────
|
|
377
|
-
/** Write `text` to a synced sibling temp file and publish it: replace `target`, or with `create` only when it is absent. */
|
|
378
|
-
function publish(target, text, create) {
|
|
379
|
-
const tmp = `${target}.recover.tmp.${String(process.pid)}.${String(++tmpCounter)}`;
|
|
380
|
-
try {
|
|
381
|
-
const fd = openSync(tmp, 'w');
|
|
382
|
-
try {
|
|
383
|
-
writeFully(fd, text);
|
|
384
|
-
fsyncSync(fd);
|
|
385
|
-
}
|
|
386
|
-
finally {
|
|
387
|
-
closeSync(fd);
|
|
388
|
-
}
|
|
389
|
-
if (!create) {
|
|
390
|
-
renameSync(tmp, target);
|
|
391
|
-
return true;
|
|
392
|
-
}
|
|
393
|
-
// A link never replaces a sidecar a concurrent save created after the check.
|
|
213
|
+
for (const [sid, events] of await deps.store.deps.storage.journals.recoveryEvents()) {
|
|
214
|
+
let doc = null;
|
|
394
215
|
try {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
}
|
|
398
|
-
catch (error) {
|
|
399
|
-
if (error.code === 'EEXIST')
|
|
400
|
-
return false;
|
|
401
|
-
throw error;
|
|
216
|
+
if (await deps.store.exists(sid))
|
|
217
|
+
doc = { messages: await deps.store.readMessages(sid, { start: 0, end: Infinity }) };
|
|
402
218
|
}
|
|
219
|
+
catch { /* corrupt */ }
|
|
220
|
+
items.push(...pendingJournalTurns(doc, sid, events));
|
|
403
221
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
222
|
+
for (const finding of items)
|
|
223
|
+
if (finding.recommendation === 'materialize_from_state_db' && await readOnlyRecovery(deps, finding.session_id)) {
|
|
224
|
+
finding.category = 'unsafe_to_repair';
|
|
225
|
+
finding.recommendation = 'manual_review';
|
|
407
226
|
}
|
|
408
|
-
|
|
409
|
-
|
|
227
|
+
const summary = { ok: s.liveIds.length, repairable: 0, unsafe_to_repair: 0 };
|
|
228
|
+
for (const i of items)
|
|
229
|
+
summary[i.category] += 1;
|
|
230
|
+
return { status: summary.unsafe_to_repair ? 'needs_manual_review' : summary.repairable ? 'warn' : 'ok', summary, items };
|
|
410
231
|
}
|
|
411
|
-
/** A resident session with a live turn would overwrite any restored file on its next save. */
|
|
412
232
|
function busy(store, sid) {
|
|
413
233
|
const s = store.sessions.get(sid);
|
|
414
234
|
return Boolean(s && (s.active_stream_id || s.pending_user_message || s.pending_started_at));
|
|
415
235
|
}
|
|
416
|
-
/** Restore shrunken and orphaned sidecars from their backups, each re-checked under the session lock. */
|
|
417
236
|
async function restoreBackups(deps, s) {
|
|
418
237
|
const { store } = deps;
|
|
419
|
-
const
|
|
420
|
-
const orphans = s.backupIds.filter((sid) => !live.has(sid) && isSafeSessionId(sid) && !s.tombstoned.has(sid) && s.db.has(sid) && messageCount(readDoc(join(s.dir, `${sid}.json.bak`))) >= 0);
|
|
238
|
+
const orphans = s.issues.filter((i) => i.kind === 'orphan_backup' && !s.tombstoned.has(i.session_id) && s.db.has(i.session_id));
|
|
421
239
|
const result = { scanned: s.liveIds.length + orphans.length, restored: 0, orphaned_backups: orphans.length, details: [] };
|
|
422
|
-
for (const
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
240
|
+
for (const issue of [...s.issues.filter((i) => i.kind === 'shrunken_live'), ...orphans]) {
|
|
241
|
+
const sid = issue.session_id;
|
|
242
|
+
await store.withLock(sid, async () => {
|
|
243
|
+
if (!await store.exists(sid) && await store.wasDeleted(sid))
|
|
244
|
+
return;
|
|
245
|
+
const counts = { live_messages: issue.live_messages, bak_messages: issue.bak_messages };
|
|
246
|
+
if (await readOnlyRecovery(deps, sid, issue.profile)) {
|
|
247
|
+
result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'read_only' });
|
|
427
248
|
return;
|
|
428
|
-
|
|
249
|
+
}
|
|
429
250
|
if (busy(store, sid)) {
|
|
430
251
|
result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'session_active' });
|
|
431
252
|
return;
|
|
432
253
|
}
|
|
433
254
|
try {
|
|
434
|
-
if (!
|
|
255
|
+
if (!await store.repair(issue)) {
|
|
435
256
|
result.details.push({ session_id: sid, restored: false, ...counts, skipped: 'sidecar_appeared' });
|
|
436
257
|
return;
|
|
437
258
|
}
|
|
@@ -440,66 +261,62 @@ async function restoreBackups(deps, s) {
|
|
|
440
261
|
result.details.push({ session_id: sid, restored: false, ...counts, error: error.message });
|
|
441
262
|
return;
|
|
442
263
|
}
|
|
443
|
-
store.sessions.delete(sid);
|
|
444
|
-
store.invalidatePersistedIds();
|
|
445
264
|
result.restored += 1;
|
|
446
265
|
result.details.push({ session_id: sid, restored: true, ...counts });
|
|
447
|
-
deps.log(`[webui] WARNING: session recovery restored ${sid} from
|
|
266
|
+
deps.log(`[webui] WARNING: session recovery restored ${sid} from its backup (live=${String(issue.live_messages)} -> bak=${String(issue.bak_messages)} messages)`);
|
|
448
267
|
});
|
|
449
268
|
}
|
|
450
269
|
return result;
|
|
451
270
|
}
|
|
452
|
-
/** Python `recover_missing_sidecars_from_state_db`: create each missing WebUI sidecar that state.db can rebuild. */
|
|
453
271
|
async function materializeSidecars(deps, s) {
|
|
454
272
|
const { store } = deps;
|
|
455
273
|
const rows = s.db.missing.filter((row) => row.messages.length && !s.tombstoned.has(row.id));
|
|
456
274
|
const result = { scanned: rows.length, materialized: 0, details: [] };
|
|
457
275
|
for (const row of rows) {
|
|
458
|
-
await store.withLock(row.id, () => {
|
|
459
|
-
if (store.wasDeleted(row.id))
|
|
276
|
+
await store.withLock(row.id, async () => {
|
|
277
|
+
if (await store.wasDeleted(row.id))
|
|
278
|
+
return;
|
|
279
|
+
if (await readOnlyRecovery(deps, row.id)) {
|
|
280
|
+
result.details.push({ session_id: row.id, materialized: false, skipped: 'read_only' });
|
|
460
281
|
return;
|
|
282
|
+
}
|
|
461
283
|
if (busy(store, row.id)) {
|
|
462
284
|
result.details.push({ session_id: row.id, materialized: false, skipped: 'session_active' });
|
|
463
285
|
return;
|
|
464
286
|
}
|
|
465
287
|
try {
|
|
466
|
-
|
|
467
|
-
if (!publish(store.pathFor(row.id), JSON.stringify(sidecarFromStateDbRow(row, store, deps.profile), null, 2), true)) {
|
|
288
|
+
if (await store.exists(row.id)) {
|
|
468
289
|
result.details.push({ session_id: row.id, materialized: false, skipped: 'sidecar_appeared_during_reconcile' });
|
|
469
290
|
return;
|
|
470
291
|
}
|
|
292
|
+
await store.save(new Session((await sidecarFromStateDbRow(row, store, deps.profile)), (await store.deps.defaults(deps.profile))), { touchUpdatedAt: false, skipIndex: true });
|
|
471
293
|
}
|
|
472
294
|
catch (error) {
|
|
473
295
|
result.details.push({ session_id: row.id, materialized: false, error: error.message });
|
|
474
296
|
return;
|
|
475
297
|
}
|
|
476
298
|
store.sessions.delete(row.id);
|
|
477
|
-
store.invalidatePersistedIds();
|
|
478
299
|
result.materialized += 1;
|
|
479
300
|
result.details.push({ session_id: row.id, materialized: true, messages: row.messages.length });
|
|
480
301
|
});
|
|
481
302
|
}
|
|
482
303
|
return result;
|
|
483
304
|
}
|
|
484
|
-
/**
|
|
485
|
-
* Python `repair_safe_session_recovery`: restore repairable backups, materialize missing sidecars from state.db, rebuild
|
|
486
|
-
* the index from the sidecars on disk, and audit again. `clean` holds only when the second audit has no finding.
|
|
487
|
-
*/
|
|
488
305
|
export async function repairSafeSessionRecovery(deps) {
|
|
489
|
-
const before = auditSessionRecovery(deps);
|
|
490
|
-
const s = scan(deps);
|
|
306
|
+
const before = await auditSessionRecovery(deps);
|
|
307
|
+
const s = await scan(deps);
|
|
491
308
|
const backupRepair = await restoreBackups(deps, s);
|
|
492
309
|
const sidecarRepair = await materializeSidecars(deps, s);
|
|
493
|
-
const reindex = backupRepair.restored || sidecarRepair.materialized || !
|
|
494
|
-
if (reindex
|
|
310
|
+
const reindex = backupRepair.restored || sidecarRepair.materialized || !await deps.store.hasIndex() || before.items.some((i) => i.recommendation === 'rebuild_index');
|
|
311
|
+
if (reindex) {
|
|
495
312
|
try {
|
|
496
|
-
deps.store.rebuildIndex({ diskOnly: true });
|
|
313
|
+
await deps.store.rebuildIndex({ diskOnly: true });
|
|
497
314
|
}
|
|
498
315
|
catch (error) {
|
|
499
316
|
deps.log(`[webui] WARNING: session recovery index rebuild failed: ${error.message}`);
|
|
500
317
|
}
|
|
501
318
|
}
|
|
502
|
-
const after = auditSessionRecovery(deps);
|
|
319
|
+
const after = await auditSessionRecovery(deps);
|
|
503
320
|
const clean = after.summary.repairable === 0 && after.summary.unsafe_to_repair === 0;
|
|
504
321
|
return { clean, ok: clean, repaired: backupRepair.restored + sidecarRepair.materialized, before, backup_repair: backupRepair, sidecar_repair: sidecarRepair, after };
|
|
505
322
|
}
|