@maudecode/talaria-web 1.17.2 → 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.d.ts +1 -1
- package/dist/api/auth-raw.js +20 -20
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +7 -1
- package/dist/api/automation-raw.js +74 -27
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +128 -23
- package/dist/api/automation-router.js +29 -13
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1845 -40
- package/dist/api/chat-router.js +196 -114
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +37 -3
- package/dist/api/git-router.js +47 -48
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +9 -1
- package/dist/api/raw-routes.js +286 -73
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +16 -6
- package/dist/api/router.js +28 -26
- 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 +3312 -131
- package/dist/api/sessions-router.js +287 -157
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +457 -8
- package/dist/api/settings-router.js +54 -33
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +7 -2
- package/dist/api/sse-routes.js +109 -62
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +63 -55
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +998 -85
- package/dist/api/tools-router.js +447 -61
- 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 +98 -59
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +15 -11
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/oidc.d.ts +5 -2
- package/dist/auth/oidc.js +8 -7
- package/dist/auth/oidc.js.map +1 -1
- package/dist/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 +15 -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 +116 -60
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +19 -6
- 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 +31 -12
- package/dist/http/context.js +60 -24
- package/dist/http/context.js.map +1 -1
- package/dist/http/csp.d.ts +2 -1
- package/dist/http/csp.js +3 -2
- package/dist/http/csp.js.map +1 -1
- package/dist/onboarding.d.ts +2 -2
- package/dist/onboarding.js +10 -8
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.d.ts +20 -4
- package/dist/profiles/profiles.js +115 -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 +84 -14
- package/dist/providers/catalog.js +474 -151
- 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/raster-image.d.ts +7 -0
- package/dist/raster-image.js +267 -0
- package/dist/raster-image.js.map +1 -0
- package/dist/redact.js +342 -46
- 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 +305 -96
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +15 -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 -27
- package/dist/sessions/background-tasks.js +89 -97
- 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 +27 -6
- package/dist/sessions/cli-sessions.js +152 -42
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +77 -9
- package/dist/sessions/completions.js +482 -45
- 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 +5 -0
- package/dist/sessions/export.js +30 -0
- package/dist/sessions/export.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/gateway-watcher.d.ts +7 -3
- package/dist/sessions/gateway-watcher.js +31 -19
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/goals.d.ts +31 -0
- package/dist/sessions/goals.js +75 -0
- package/dist/sessions/goals.js.map +1 -0
- package/dist/sessions/handoff.d.ts +32 -0
- package/dist/sessions/handoff.js +114 -0
- package/dist/sessions/handoff.js.map +1 -0
- package/dist/sessions/journal.d.ts +5 -79
- package/dist/sessions/journal.js +15 -606
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +31 -16
- package/dist/sessions/list.js +139 -129
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +69 -13
- package/dist/sessions/merge.js +265 -64
- 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 +19 -0
- package/dist/sessions/recovery.js +322 -0
- package/dist/sessions/recovery.js.map +1 -0
- package/dist/sessions/relay.d.ts +38 -19
- package/dist/sessions/relay.js +302 -79
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +260 -55
- package/dist/sessions/service.js +1448 -462
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +24 -2
- package/dist/sessions/session.js +69 -7
- 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.d.ts +1 -0
- package/dist/sessions/state-db-worker.js +35 -0
- package/dist/sessions/state-db-worker.js.map +1 -0
- package/dist/sessions/state-db.d.ts +113 -7
- package/dist/sessions/state-db.js +861 -44
- 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 +65 -68
- package/dist/sessions/store.js +305 -602
- 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.d.ts +2 -0
- package/dist/sessions/titles.js +5 -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 +30 -50
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +11 -2
- package/dist/sessions/turn-context.js +18 -11
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +122 -17
- package/dist/sessions/turn.js +939 -358
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +54 -0
- package/dist/sessions/wakeup-pause.js +163 -0
- package/dist/sessions/wakeup-pause.js.map +1 -0
- 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 +178 -184
- 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.d.ts +2 -2
- package/dist/sidecar/fake.js +19 -2
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/startup.d.ts +13 -5
- package/dist/startup.js +48 -0
- package/dist/startup.js.map +1 -1
- package/dist/test/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/test/ts-worker-hooks.d.ts +1 -0
- package/dist/test/ts-worker-hooks.js +24 -0
- package/dist/test/ts-worker-hooks.js.map +1 -0
- package/dist/text/diff.d.ts +9 -14
- package/dist/text/diff.js +74 -108
- package/dist/text/diff.js.map +1 -1
- package/dist/tools/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 +122 -18
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +53 -0
- package/dist/tools/dashboard-plugins.js +188 -0
- package/dist/tools/dashboard-plugins.js.map +1 -0
- package/dist/tools/extensions.d.ts +18 -5
- package/dist/tools/extensions.js +344 -266
- 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 +44 -0
- package/dist/tools/health.js +201 -46
- 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/mcp.d.ts +13 -0
- package/dist/tools/mcp.js +88 -0
- 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-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/project-os.d.ts +11 -0
- package/dist/tools/project-os.js +267 -0
- package/dist/tools/project-os.js.map +1 -0
- package/dist/tools/skills.d.ts +14 -5
- package/dist/tools/skills.js +49 -16
- 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 +110 -32
- package/dist/tools/updates.js +1112 -294
- package/dist/tools/updates.js.map +1 -1
- package/dist/tools/wiki.d.ts +68 -0
- package/dist/tools/wiki.js +413 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/util.d.ts +2 -0
- package/dist/util.js +5 -0
- package/dist/util.js.map +1 -1
- package/dist/workspace/escape.d.ts +61 -0
- package/dist/workspace/escape.js +149 -0
- package/dist/workspace/escape.js.map +1 -0
- package/dist/workspace/extract.d.ts +22 -0
- package/dist/workspace/extract.js +308 -0
- package/dist/workspace/extract.js.map +1 -0
- package/dist/workspace/fs.d.ts +12 -0
- package/dist/workspace/fs.js +92 -23
- package/dist/workspace/fs.js.map +1 -1
- package/dist/workspace/git.d.ts +34 -1
- package/dist/workspace/git.js +328 -35
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +16 -13
- package/dist/workspace/media.js +43 -61
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/rollback.d.ts +36 -22
- package/dist/workspace/rollback.js +178 -272
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/unzip.js +4 -1
- package/dist/workspace/unzip.js.map +1 -1
- package/dist/workspace/upload.d.ts +7 -4
- package/dist/workspace/upload.js +5 -2
- package/dist/workspace/upload.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.d.ts +2 -1
- package/dist/workspace/worktrees.js +179 -42
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +7 -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 +32 -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 +56 -3
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +166 -24
- package/sidecar/talaria_sidecar/methods/chat.py +852 -135
- package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
- package/sidecar/talaria_sidecar/methods/commands.py +294 -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 +395 -36
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +212 -55
- 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 +108 -34
- package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
- 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 +218 -15
- package/sidecar/talaria_sidecar/methods/profiles.py +121 -13
- package/sidecar/talaria_sidecar/methods/providers.py +217 -28
- 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 +316 -75
- 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 +98 -13
- package/sidecar/talaria_sidecar/speed.py +35 -0
- package/static/dist/FILES.txt +126 -126
- 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-opyh9y0v.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-bfd4h3id.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-b2x1lqot.js → abnfDiagram-VCTEODGH-gjayq3ra.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-h38o5l7b.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-bqquxv2u.js → blockDiagram-I7D4REHJ-joedghi3.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-f3fb8w6z.js → c4Diagram-7LVT6UL2-hyrjrohe.js} +1 -1
- package/static/dist/assets/channel-es95o4y8.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-bzfyyzp3.js → chunk-4HAMMTFA-koouqbut.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-ly99rfx5.js → chunk-75Z2AOVW-bl4bhdnt.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-bg6ecfqf.js → chunk-DU6HZSFF-gpedttsp.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-e8k7mmqw.js → chunk-F27PBJKO-d8xxi0zi.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-cmalnoaj.js → chunk-GMAD6QVW-jro0hl73.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-gmif5o01.js → chunk-GVQU2GXP-djn6gbyu.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-f1nwwh6u.js → chunk-IMKFNOWR-vw4p5p7o.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-oktfh5v7.js → chunk-L3NEJ4N5-n1hj77q8.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-b1sdx96z.js → chunk-OSK3NFVY-oy0gwn2n.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-fhu4nzxt.js → chunk-P2QGCYS3-onf1hz6c.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-em31rnef.js → chunk-POPQ4Y6H-m8sqn7cs.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-bxhhyftw.js → chunk-PWAF6VOD-ek4smc8x.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-fmrvwcav.js → chunk-SHT3W25Y-g9gfvefo.js} +3 -3
- package/static/dist/assets/{chunk-SVP7TREG-lymukl2j.js → chunk-SVP7TREG-f9nfv2cu.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-lmza6k23.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-fw5b1pc6.js → copy-jamtd1pf.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-czlhbyhs.js → cynefin-OW5HDTMX-f8xfdd3f.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-gq7mvswb.js → cynefinDiagram-5FMLGOSQ-n9lb99h9.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-cqdbf7dr.js → dagre-GXQ25YYZ-dgailddi.js} +4 -4
- package/static/dist/assets/{diagram-S7CK7UJ4-o6arxa58.js → diagram-S7CK7UJ4-m6aeoe7c.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-nhnd68tz.js → diagram-UQ7AKVKN-jall3j0x.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-dk2sclzn.js → diagram-VSXAHHWV-hbawi7hn.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-n3k5nyx3.js → diagram-VX7I27RA-hendl2tt.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-m6q9cwdh.js → diagram-Z3DM3KII-igwc35p3.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-lsa5641p.js → ebnfDiagram-PWID7BFC-c64knz08.js} +1 -1
- package/static/dist/assets/{erDiagram-RLTQ6QDP-fo2ckbe6.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-nzqz6x9g.js → ganttDiagram-EL5Y4UJY-ma6jxj5i.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-gukvcxe6.js → gitGraph-4MIJSDKK-naa9w6xa.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-lqhdp8f0.js → gitGraphDiagram-WWUBYQGX-hzltvsod.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-igw6cp39.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-gvu7a93l.js → info-A6RAGUB7-mn2ut5ko.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-m8t8g6w1.js → infoDiagram-27XIBGKW-h6kuqvsb.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-l07vkbgj.js → ishikawaDiagram-5VMMS53U-e7bnwq7h.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-hybkgj8l.js → journeyDiagram-3NMN7TZE-etd1bi6p.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-by13uvtn.js → kanban-definition-UXKFOSKX-emb1g9dz.js} +4 -4
- package/static/dist/assets/lazyRouteComponent-o816ytzl.js +1 -0
- package/static/dist/assets/{line-osxq6fq7.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-i91oxmou.js → mermaid-parser.core-bnre27u8.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-m82mx8ww.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-nbtgge2o.js → packet-AYTQ26CC-hatq7m2e.js} +1 -1
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/{pegDiagram-XKGWAZYB-f1zxzga1.js → pegDiagram-XKGWAZYB-gwisz8jv.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-of8vuhxs.js → pie-WAS4IAKB-fpftf0mk.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-o7y8ftio.js → pieDiagram-E7YTZNPT-khm1o9a6.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-iqiwia1t.js → quadrantDiagram-AXDQQJYC-owqc4uqn.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-delnsy2v.js → radar-RG4KPBEZ-cntfwjpq.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-nspnyq9u.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-z41tqx5z.js → railroadDiagram-O6MQD6OU-etuh0qa0.js} +1 -1
- package/static/dist/assets/{refresh-cw-nt1dtsx4.js → refresh-cw-mqbkv2a3.js} +1 -1
- package/static/dist/assets/refresh-l29ljp76.js +1 -0
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-bdvif194.js → requirementDiagram-BXWQKSXE-oq2ulk22.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-h73e0rol.js → sankeyDiagram-P5KCCOFB-iqc02emv.js} +1 -1
- package/static/dist/assets/saved-ndd4t2xb.js +1 -0
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-iv95mb1z.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-k417ixmf.js → stateDiagram-D77RDMKH-dnpt1ato.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-esola70w.js → swimlanes-42K2YHIH-loqbdazb.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-getrz2y8.js → timeline-definition-24CTP7MA-ol2hnvma.js} +1 -1
- package/static/dist/assets/toast-i3h34v6o.js +64 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-hc7ap1q7.js → treeView-Q6P3EWNA-idrj6iox.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-b7k1syy5.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-lhg566ew.js → useParams-gjc70qru.js} +1 -1
- package/static/dist/assets/{useSearch-lbrh6ejn.js → useSearch-e6ae539u.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-n6pcy5qb.js → vennDiagram-4TSXK5OY-bvwr9o2z.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-lpa18vz1.js → wardley-WFR3VGLG-31ui8tma.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-kpclwwg7.js → wardleyDiagram-VM6X3IG4-k5wqtx4b.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-paa2n8y0.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-fb2td9zi.js +0 -1
- package/static/dist/assets/ChatPage-cj96kiy9.js +0 -25
- package/static/dist/assets/Dialog-kxcg7ard.js +0 -1
- package/static/dist/assets/ExtensionRoute-jf7h0754.js +0 -1
- package/static/dist/assets/HubRoute-gmanpd5y.js +0 -2
- package/static/dist/assets/Markdown-mdwlvj3w.js +0 -598
- package/static/dist/assets/RightPanel-ftvrjlcp.js +0 -1
- package/static/dist/assets/Select-bilaypej.js +0 -1
- package/static/dist/assets/SessionListPanel-og8n36qs.js +0 -1
- package/static/dist/assets/SettingsLayout-jonjefmj.js +0 -1
- package/static/dist/assets/States-nmejrwrm.js +0 -1
- package/static/dist/assets/Toaster-nnl8zkt9.js +0 -1
- package/static/dist/assets/_app-gdidzd94.js +0 -1
- package/static/dist/assets/_app.index-hbarzbjx.js +0 -1
- package/static/dist/assets/_app.insights-luywlarz.js +0 -1
- package/static/dist/assets/_app.kanban-kincnbr8.js +0 -1
- package/static/dist/assets/_app.logs-oi2gr3gs.js +0 -1
- package/static/dist/assets/_app.memory-b6jfivt6.js +0 -1
- package/static/dist/assets/_app.profiles-lpvixmqp.js +0 -1
- package/static/dist/assets/_app.settings-vowx3iq0.js +0 -1
- package/static/dist/assets/_app.settings._section-cnntg1tu.js +0 -3
- package/static/dist/assets/_app.skills-fb57lpau.js +0 -1
- package/static/dist/assets/_app.tasks-eszpx1q7.js +0 -2
- package/static/dist/assets/_app.todos-nr05ac6w.js +0 -1
- package/static/dist/assets/_app.workspaces-d2luomu6.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-hd0o7bde.js +0 -1
- package/static/dist/assets/back-bemaer09.js +0 -1
- package/static/dist/assets/cancel-drd0g6d9.js +0 -1
- package/static/dist/assets/channel-cpdgf867.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-ko09sguk.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-ko09sguk.js +0 -1
- package/static/dist/assets/copied-ima3pysb.js +0 -1
- package/static/dist/assets/endpoints-d33siokx.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-emctlo64.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-bfi3moqa.js +0 -1
- package/static/dist/assets/index-cxq58xb1.js +0 -11
- package/static/dist/assets/index-hgtx08n5.css +0 -2
- package/static/dist/assets/lazyRouteComponent-af0lvgjx.js +0 -1
- package/static/dist/assets/link-jyxicdhg.js +0 -1
- package/static/dist/assets/login-ec21t39x.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-gfl8z3ep.js +0 -1
- package/static/dist/assets/onboarding-btnltvyz.js +0 -1
- package/static/dist/assets/onboarding_model_label-dp7xffoh.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nst1qxyn.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-ci37x8qy.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-aimkk07z.js +0 -1
- package/static/dist/assets/refresh-b4uams1i.js +0 -1
- package/static/dist/assets/saved-kg52csy7.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-ej0iapxe.js +0 -1
- package/static/dist/assets/share._token-f97e94r0.js +0 -2
- package/static/dist/assets/sliders-horizontal-fj18it47.js +0 -1
- package/static/dist/assets/sse-fwpqtzbg.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hwn4apct.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d1h97oyg.js +0 -8
- package/static/dist/assets/todoStore-eginf9h4.js +0 -1
- package/static/dist/assets/tts-lxdxnmjd.js +0 -1
- package/static/dist/assets/untitled-ovpfthg4.js +0 -1
- package/static/dist/assets/useForm-bcblv1rx.js +0 -1
- package/static/dist/assets/useLocale-fi5jb8ma.js +0 -1
package/dist/sessions/list.js
CHANGED
|
@@ -10,54 +10,12 @@ import { createHash } from 'node:crypto';
|
|
|
10
10
|
import { redactText } from '../redact.js';
|
|
11
11
|
import { CONTEXT_USAGE_FIELDS, Session, contextUsage, sharePath, stripSidebarHeavyMetadata } from './session.js';
|
|
12
12
|
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
13
|
-
import { isCliSessionRow as isStateDbCliRow, isCliSessionRowVisible, normalizeAgentSessionSource } from './state-db.js';
|
|
13
|
+
import { AGENT_STORAGE_OK, CANONICAL_READ_ONLY_REASON, OWNERSHIP_UNAVAILABLE_REASON, isCliSessionRow as isStateDbCliRow, isCliSessionRowVisible, normalizeAgentSessionSource } from './state-db.js';
|
|
14
14
|
import { MESSAGING_SOURCES, sourceKind } from './source-kind.js';
|
|
15
|
-
import {
|
|
15
|
+
import {} from '@maudecode/talaria-web-contracts';
|
|
16
16
|
const num = (v) => { const n = Number(v ?? 0); return Number.isFinite(n) && n > 0 ? n : 0; };
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export function sanitizeSessionRow(value, store, file) {
|
|
20
|
-
const row = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
21
|
-
file ??= `${str(row.session_id)}.json`;
|
|
22
|
-
const mismatchedFile = file.endsWith('.json') && file !== '_index.json' && row.session_id !== file.slice(0, -5);
|
|
23
|
-
if (!SessionRowSchema.shape.session_id.safeParse(row.session_id).success || mismatchedFile) {
|
|
24
|
-
const logged = malformedFiles.get(store) ?? new Set();
|
|
25
|
-
if (!logged.has(file)) {
|
|
26
|
-
store.deps.log(`[webui] WARNING: skipping session row with invalid session_id in ${JSON.stringify(file)}`);
|
|
27
|
-
logged.add(file);
|
|
28
|
-
malformedFiles.set(store, logged);
|
|
29
|
-
}
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
const result = { ...row, title: row.title ?? '' };
|
|
33
|
-
for (const [key, schema] of Object.entries(SessionRowSchema.shape)) {
|
|
34
|
-
const value = result[key];
|
|
35
|
-
if (value === undefined || schema.safeParse(value).success)
|
|
36
|
-
continue;
|
|
37
|
-
const coerced = typeof value === 'string' && value.trim() !== ''
|
|
38
|
-
? value.trim() === 'true' ? true : value.trim() === 'false' ? false : Number(value)
|
|
39
|
-
: typeof value === 'number' || typeof value === 'boolean' ? String(value) : undefined;
|
|
40
|
-
const boolean = value === 0 || value === 1 ? value === 1 : coerced === 0 || coerced === 1 ? coerced === 1 : undefined;
|
|
41
|
-
if (coerced !== undefined && schema.safeParse(coerced).success)
|
|
42
|
-
result[key] = coerced;
|
|
43
|
-
else if (boolean !== undefined && schema.safeParse(boolean).success)
|
|
44
|
-
result[key] = boolean;
|
|
45
|
-
else if (key === 'title')
|
|
46
|
-
result[key] = '';
|
|
47
|
-
// Invalid persisted permissions must not turn a locked session into an editable one.
|
|
48
|
-
else if (key === 'read_only')
|
|
49
|
-
result[key] = true;
|
|
50
|
-
else
|
|
51
|
-
Reflect.deleteProperty(result, key);
|
|
52
|
-
}
|
|
53
|
-
// These persisted flags affect list filtering before the wire flags are computed.
|
|
54
|
-
for (const key of ['pre_compression_snapshot', 'default_hidden', 'has_pending_user_message']) {
|
|
55
|
-
if (result[key] === 'true' || result[key] === 'false')
|
|
56
|
-
result[key] = result[key] === 'true';
|
|
57
|
-
}
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
/** TAL-306: the row's `sort_ts`, the time it sorts and date-buckets by on every client. */
|
|
17
|
+
import { sanitizeSessionRow } from './storage/row.js';
|
|
18
|
+
export { sanitizeSessionRow } from './storage/row.js';
|
|
61
19
|
export function sessionSortTimestamp(row) {
|
|
62
20
|
return num(row.last_message_at) || num(row.updated_at) || num(row.created_at);
|
|
63
21
|
}
|
|
@@ -205,7 +163,7 @@ function isEmptyUntitledDraft(row) {
|
|
|
205
163
|
return str(row.title || 'Untitled') === 'Untitled' && Math.trunc(Number(row.message_count ?? 0)) === 0 && !row.active_stream_id && !row.has_pending_user_message && !row.worktree_path;
|
|
206
164
|
}
|
|
207
165
|
/** Python `all_sessions` without the state.db lineage overlay. */
|
|
208
|
-
export function allSessions(store, opts = {}) {
|
|
166
|
+
export async function allSessions(store, opts = {}) {
|
|
209
167
|
const activeStreamIds = store.deps.activeStreamIds();
|
|
210
168
|
const finish = (result) => {
|
|
211
169
|
result = result.flatMap((row) => { const clean = sanitizeSessionRow(row, store); return clean ? [clean] : []; });
|
|
@@ -228,43 +186,43 @@ export function allSessions(store, opts = {}) {
|
|
|
228
186
|
}
|
|
229
187
|
return rows.sort(compareSessionRows);
|
|
230
188
|
};
|
|
231
|
-
const indexExists = (() => { try {
|
|
232
|
-
return Boolean(store.readIndexEntries());
|
|
189
|
+
const indexExists = (await (async () => { try {
|
|
190
|
+
return Boolean((await store.readIndexEntries()));
|
|
233
191
|
}
|
|
234
192
|
catch {
|
|
235
193
|
return false;
|
|
236
|
-
} })();
|
|
194
|
+
} })());
|
|
237
195
|
if (!indexExists) {
|
|
238
196
|
try {
|
|
239
|
-
store.writeIndex();
|
|
197
|
+
(await store.writeIndex());
|
|
240
198
|
}
|
|
241
199
|
catch { /* fall through to the scan */ }
|
|
242
200
|
}
|
|
243
201
|
try {
|
|
244
|
-
let index = store.readIndexEntries().flatMap((row) => {
|
|
245
|
-
const clean = sanitizeSessionRow(row, store, '
|
|
202
|
+
let index = (await store.readIndexEntries()).flatMap((row) => {
|
|
203
|
+
const clean = sanitizeSessionRow(row, store, 'index');
|
|
246
204
|
return clean ? [clean] : [];
|
|
247
205
|
});
|
|
248
206
|
const inMemory = new Set(store.sessions.keys());
|
|
249
|
-
const persisted = store.persistedIds();
|
|
250
|
-
if (!index.length && store.hasPersistedSessionFiles())
|
|
207
|
+
const persisted = (await store.persistedIds());
|
|
208
|
+
if (!index.length && (await store.hasPersistedSessionFiles()))
|
|
251
209
|
throw new Error('empty session index while session files exist');
|
|
252
210
|
index = index.filter((r) => inMemory.has(str(r.session_id)) || persisted.has(str(r.session_id)));
|
|
253
|
-
if (!index.length && store.hasPersistedSessionFiles())
|
|
211
|
+
if (!index.length && (await store.hasPersistedSessionFiles()))
|
|
254
212
|
throw new Error('session index has no live rows while session files exist');
|
|
255
213
|
const backfilled = [];
|
|
256
|
-
index = index.map((r) => {
|
|
214
|
+
index = await Promise.all(index.map(async (r) => {
|
|
257
215
|
if ('last_message_at' in r)
|
|
258
216
|
return r;
|
|
259
|
-
const full = store.load(str(r.session_id));
|
|
217
|
+
const full = (await store.load(str(r.session_id)));
|
|
260
218
|
if (!full)
|
|
261
219
|
return r;
|
|
262
220
|
backfilled.push(full);
|
|
263
221
|
return full.compact({ sidebarMetadataOnly: opts.sidebarMetadataOnly ?? false });
|
|
264
|
-
});
|
|
222
|
+
}));
|
|
265
223
|
if (backfilled.length) {
|
|
266
224
|
try {
|
|
267
|
-
store.writeIndex(backfilled);
|
|
225
|
+
(await store.writeIndex(backfilled));
|
|
268
226
|
}
|
|
269
227
|
catch { /* ignore */ }
|
|
270
228
|
}
|
|
@@ -276,7 +234,7 @@ export function allSessions(store, opts = {}) {
|
|
|
276
234
|
const missing = [...persisted].filter((sid) => !indexMap.has(sid)).sort();
|
|
277
235
|
const recovered = [];
|
|
278
236
|
for (const sid of missing) {
|
|
279
|
-
const sidecar = store.loadMetadataOnly(sid);
|
|
237
|
+
const sidecar = (await store.loadMetadataOnly(sid));
|
|
280
238
|
if (!sidecar)
|
|
281
239
|
continue;
|
|
282
240
|
indexMap.set(sidecar.session_id, sidecar.compact({ includeRuntime: true, activeStreamIds, sidebarMetadataOnly: opts.sidebarMetadataOnly ?? false }));
|
|
@@ -284,12 +242,12 @@ export function allSessions(store, opts = {}) {
|
|
|
284
242
|
}
|
|
285
243
|
if (recovered.length) {
|
|
286
244
|
try {
|
|
287
|
-
store.writeIndex(recovered);
|
|
245
|
+
(await store.writeIndex(recovered));
|
|
288
246
|
}
|
|
289
247
|
catch { /* ignore */ }
|
|
290
248
|
}
|
|
291
|
-
const indexCounts = store.indexMessageCounts(index);
|
|
292
|
-
const refreshed = refreshIndexRowsFromSidecarMetadata(store, [...indexMap.values()], indexCounts, activeStreamIds);
|
|
249
|
+
const indexCounts = (await store.indexMessageCounts(index));
|
|
250
|
+
const refreshed = (await refreshIndexRowsFromSidecarMetadata(store, [...indexMap.values()], indexCounts, activeStreamIds));
|
|
293
251
|
let result = refreshed.filter((r) => r.session_id);
|
|
294
252
|
result = result.filter((r) => !isEmptyUntitledDraft(r));
|
|
295
253
|
return finish(result);
|
|
@@ -297,7 +255,7 @@ export function allSessions(store, opts = {}) {
|
|
|
297
255
|
catch {
|
|
298
256
|
/* fall back to the full scan */
|
|
299
257
|
}
|
|
300
|
-
const out = store.scanAll();
|
|
258
|
+
const out = (await store.scanAll());
|
|
301
259
|
for (const s of store.sessions.values())
|
|
302
260
|
if (!out.some((x) => x.session_id === s.session_id))
|
|
303
261
|
out.push(s);
|
|
@@ -306,22 +264,14 @@ export function allSessions(store, opts = {}) {
|
|
|
306
264
|
.map((s) => s.compact({ includeRuntime: true, activeStreamIds, sidebarMetadataOnly: opts.sidebarMetadataOnly ?? false }));
|
|
307
265
|
return finish(rows);
|
|
308
266
|
}
|
|
309
|
-
function sidecarMtimeAfterIndexTimestamp(store, row) {
|
|
267
|
+
async function sidecarMtimeAfterIndexTimestamp(store, row) {
|
|
310
268
|
const sid = str(row.session_id);
|
|
311
269
|
if (!sid)
|
|
312
270
|
return false;
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
return mtime > sessionSortTimestamp(row) + 0.001;
|
|
316
|
-
}
|
|
317
|
-
catch {
|
|
318
|
-
return false;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
function statSyncMtime(path) {
|
|
322
|
-
return statSync(path).mtimeMs / 1000;
|
|
271
|
+
// A backend revision is opaque; refresh legacy rows whenever persisted data exists.
|
|
272
|
+
return await store.revision(sid) !== null;
|
|
323
273
|
}
|
|
324
|
-
function rowMayNeedSidecarRefresh(store, row, staleSnapshotIds) {
|
|
274
|
+
async function rowMayNeedSidecarRefresh(store, row, staleSnapshotIds) {
|
|
325
275
|
if (hasLiveState(row))
|
|
326
276
|
return true;
|
|
327
277
|
const sid = str(row.session_id);
|
|
@@ -332,15 +282,15 @@ function rowMayNeedSidecarRefresh(store, row, staleSnapshotIds) {
|
|
|
332
282
|
return true;
|
|
333
283
|
const lineageShaped = Boolean(row.parent_session_id || row._lineage_root_id || row._compression_segment_count);
|
|
334
284
|
const needsMtime = Boolean(sid) && (looksLikeStaleZeroMessageRow(row) || (lineageShaped && (row.user_message_count === null || row.user_message_count === undefined)));
|
|
335
|
-
return needsMtime && sidecarMtimeAfterIndexTimestamp(store, row);
|
|
285
|
+
return needsMtime && await sidecarMtimeAfterIndexTimestamp(store, row);
|
|
336
286
|
}
|
|
337
|
-
if (sid && looksLikeStaleZeroMessageRow(row) && str(row.session_source).trim().toLowerCase() !== 'fork' && sidecarMtimeAfterIndexTimestamp(store, row))
|
|
287
|
+
if (sid && looksLikeStaleZeroMessageRow(row) && str(row.session_source).trim().toLowerCase() !== 'fork' && await sidecarMtimeAfterIndexTimestamp(store, row))
|
|
338
288
|
return true;
|
|
339
289
|
if (row.message_count === null || row.message_count === undefined || row.last_message_at === null || row.last_message_at === undefined)
|
|
340
290
|
return true;
|
|
341
291
|
return Boolean(sid) && staleSnapshotIds.has(sid);
|
|
342
292
|
}
|
|
343
|
-
function staleSnapshotRefreshIds(store, rows) {
|
|
293
|
+
async function staleSnapshotRefreshIds(store, rows) {
|
|
344
294
|
const byId = new Map(rows.filter((r) => r.session_id).map((r) => [str(r.session_id), r]));
|
|
345
295
|
const groups = new Map();
|
|
346
296
|
for (const row of rows) {
|
|
@@ -364,23 +314,23 @@ function staleSnapshotRefreshIds(store, rows) {
|
|
|
364
314
|
continue;
|
|
365
315
|
if (snapshot.user_message_count !== null && snapshot.user_message_count !== undefined && Math.trunc(Number(snapshot.message_count ?? 0)) > 0 && snapshot.last_message_at !== null && snapshot.last_message_at !== undefined)
|
|
366
316
|
continue;
|
|
367
|
-
if (sidecarMtimeAfterIndexTimestamp(store, snapshot))
|
|
317
|
+
if (await sidecarMtimeAfterIndexTimestamp(store, snapshot))
|
|
368
318
|
ids.add(sid);
|
|
369
319
|
}
|
|
370
320
|
}
|
|
371
321
|
return ids;
|
|
372
322
|
}
|
|
373
323
|
const REFRESH_KEYS = ['message_count', 'updated_at', 'last_message_at', 'title', 'workspace', 'model', 'model_provider', 'created_at', 'pinned', 'archived', 'project_id', 'profile', 'pre_compression_snapshot', 'parent_session_id', 'source_tag', 'raw_source', 'session_source', 'source_label', 'active_stream_id', 'has_pending_user_message', 'pending_user_message', 'pending_started_at'];
|
|
374
|
-
function refreshIndexRowsFromSidecarMetadata(store, rows, indexCounts, activeStreamIds) {
|
|
375
|
-
const stale = staleSnapshotRefreshIds(store, rows);
|
|
324
|
+
async function refreshIndexRowsFromSidecarMetadata(store, rows, indexCounts, activeStreamIds) {
|
|
325
|
+
const stale = await staleSnapshotRefreshIds(store, rows);
|
|
376
326
|
const out = [];
|
|
377
327
|
for (const row of rows) {
|
|
378
328
|
const sid = str(row.session_id);
|
|
379
|
-
if (!rowMayNeedSidecarRefresh(store, row, stale) || !sid) {
|
|
329
|
+
if (!await rowMayNeedSidecarRefresh(store, row, stale) || !sid) {
|
|
380
330
|
out.push(row);
|
|
381
331
|
continue;
|
|
382
332
|
}
|
|
383
|
-
const sidecar = store.loadMetadataOnly(sid, { indexMessageCounts: indexCounts });
|
|
333
|
+
const sidecar = (await store.loadMetadataOnly(sid, { indexMessageCounts: indexCounts }));
|
|
384
334
|
if (!sidecar) {
|
|
385
335
|
out.push(row);
|
|
386
336
|
continue;
|
|
@@ -407,7 +357,7 @@ export const SIDEBAR_SESSION_RESPONSE_FIELDS = new Set([
|
|
|
407
357
|
'is_cli_session', 'is_messaging_session', 'is_streaming', 'cron_running', 'active_stream_id', 'has_pending_user_message', 'pending_started_at', 'default_hidden',
|
|
408
358
|
'worktree_path', 'worktree_branch', 'parent_session_id', 'parent_title', 'parent_source', 'relationship_type', 'pre_compression_snapshot', '_lineage_root_id',
|
|
409
359
|
'_lineage_tip_id', '_compression_segment_count', '_lineage_collapsed_count', '_parent_lineage_root_id', '_parent_lineage_tip_id', '_cross_surface_child_session',
|
|
410
|
-
'match_type', 'match_preview', 'read_only', 'can_branch', 'can_pin', 'can_archive', 'can_delete', 'can_duplicate', 'gateway_routing', 'share_url',
|
|
360
|
+
'match_type', 'match_preview', 'read_only', 'read_only_reason', 'can_branch', 'can_pin', 'can_archive', 'can_delete', 'can_duplicate', 'gateway_routing', 'share_url',
|
|
411
361
|
]);
|
|
412
362
|
export function isCliSessionRow(row) {
|
|
413
363
|
const lower = (v) => str(v).trim().toLowerCase();
|
|
@@ -503,15 +453,20 @@ export function isMessagingSessionRecord(row) {
|
|
|
503
453
|
return true;
|
|
504
454
|
return isKnownMessagingSource(first(row.raw_source, row.source_tag, row.source, row.source_label));
|
|
505
455
|
}
|
|
506
|
-
/**
|
|
456
|
+
/**
|
|
457
|
+
* Python `_is_claimable_cli_source`: a denylist of foreign families that own their sessions. A `kanban` state.db owner
|
|
458
|
+
* (`stateDbSessionSources` folds in the lineage's `created_source`) refuses whatever the row's tag says (TAL-793).
|
|
459
|
+
*/
|
|
507
460
|
export function isClaimableCliSource(meta, stateDbSource) {
|
|
508
|
-
if (meta.read_only)
|
|
461
|
+
if (typeof stateDbSource === 'object' || meta.read_only)
|
|
462
|
+
return false;
|
|
463
|
+
if (stateDbSource.trim().toLowerCase() === 'kanban')
|
|
509
464
|
return false;
|
|
510
465
|
const sessionSource = str(meta.session_source).trim().toLowerCase();
|
|
511
466
|
if (['messaging', 'external_agent'].includes(sessionSource))
|
|
512
467
|
return false;
|
|
513
468
|
const tag = str(meta.source_tag || meta.raw_source).trim().toLowerCase();
|
|
514
|
-
const refused = new Set(['claude_code', 'cron', 'external_agent', 'gateway', 'messaging', 'subagent', 'unknown']);
|
|
469
|
+
const refused = new Set(['claude_code', 'cron', 'external_agent', 'gateway', 'kanban', 'messaging', 'subagent', 'unknown']);
|
|
515
470
|
if (tag && refused.has(tag))
|
|
516
471
|
return false;
|
|
517
472
|
if (isMessagingSessionRecord(meta))
|
|
@@ -523,22 +478,33 @@ export function isClaimableCliSource(meta, stateDbSource) {
|
|
|
523
478
|
/**
|
|
524
479
|
* TAL-358: marks read-only each WebUI sidecar row whose active-profile state.db owner (`sessions.source`) refuses
|
|
525
480
|
* claiming, as a sidecar-less row from that owner is. A sidecar persisted as WebUI- or fork-born stays WebUI-owned
|
|
526
|
-
*
|
|
481
|
+
* for legacy source tags, but cannot override a canonical receipt or ledger. Owners are batched per profile; an
|
|
527
482
|
* unreadable state.db (null) locks every candidate, since an unknown owner is not a released one.
|
|
528
483
|
*/
|
|
529
484
|
export function withOwnerLocks(rows, stateDbSources) {
|
|
530
|
-
const
|
|
531
|
-
const
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
485
|
+
const byProfile = ownerLockCandidates(rows);
|
|
486
|
+
const ownersByProfile = new Map([...byProfile].map(([profile, ids]) => [profile, stateDbSources([...ids], profile)]));
|
|
487
|
+
return rows.map((r) => {
|
|
488
|
+
const owners = ownersByProfile.get(str(r.profile) || 'default');
|
|
489
|
+
const owner = owners?.get(str(r.session_id).trim());
|
|
490
|
+
if (typeof owner === 'object')
|
|
491
|
+
return { ...r, ...(owner.source ? { ...normalizeAgentSessionSource(owner.source), source_tag: owner.source } : {}), read_only: true, read_only_reason: owner.reason ?? CANONICAL_READ_ONLY_REASON };
|
|
492
|
+
const webui = ['source_tag', 'raw_source', 'session_source'].some((k) => ['webui', 'fork'].includes(str(r[k]).trim().toLowerCase()));
|
|
493
|
+
if (!owners || (!webui && owner && !isClaimableCliSource({ source_tag: owner, ...normalizeAgentSessionSource(owner) }, owner)))
|
|
494
|
+
return { ...r, read_only: true, ...(!owners ? { read_only_reason: OWNERSHIP_UNAVAILABLE_REASON } : {}) };
|
|
495
|
+
return r;
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
/** Every sidecar is checked in its own profile, including cached WebUI/fork tags. */
|
|
499
|
+
export function ownerLockCandidates(rows) {
|
|
500
|
+
const byProfile = new Map();
|
|
501
|
+
for (const row of rows) {
|
|
502
|
+
const profile = str(row.profile) || 'default';
|
|
503
|
+
const ids = byProfile.get(profile) ?? new Set();
|
|
504
|
+
ids.add(str(row.session_id).trim());
|
|
505
|
+
byProfile.set(profile, ids);
|
|
506
|
+
}
|
|
507
|
+
return byProfile;
|
|
542
508
|
}
|
|
543
509
|
/** Python `_session_is_subagent_view_only` on a row: a delegated child by any source marker. */
|
|
544
510
|
export function isSubagentRow(row) {
|
|
@@ -573,15 +539,16 @@ export function withSessionWireFlags(row, activeStreamIds) {
|
|
|
573
539
|
else
|
|
574
540
|
r.read_only = Boolean(r.read_only);
|
|
575
541
|
// The branch gate (`SessionService.branch`): never a subagent child, and a read-only source only when it is a cron run.
|
|
576
|
-
|
|
542
|
+
const ownerReadOnly = r.read_only && Boolean(r.read_only_reason);
|
|
543
|
+
r.can_branch = !ownerReadOnly && !subagent && (!r.read_only || str(r.source_tag || r.raw_source).trim().toLowerCase() === 'cron');
|
|
577
544
|
// Pin and archive refuse only subagent children; duplicate also needs the WebUI sidecar it copies, so a sidecar-less
|
|
578
545
|
// foreign row arrives with `can_duplicate: false`. Rename, move and delete follow `read_only` (the mutation gate).
|
|
579
546
|
// A Claude Code import is a live view Web never stores (TAL-551), so it cannot be pinned or archived either.
|
|
580
|
-
const stored = !subagent && kind !== 'claude_code';
|
|
547
|
+
const stored = !ownerReadOnly && !subagent && kind !== 'claude_code';
|
|
581
548
|
r.can_pin = stored;
|
|
582
549
|
r.can_archive = stored;
|
|
583
550
|
r.can_delete = !r.read_only;
|
|
584
|
-
r.can_duplicate = !subagent && r.can_duplicate !== false;
|
|
551
|
+
r.can_duplicate = !ownerReadOnly && !subagent && r.can_duplicate !== false;
|
|
585
552
|
r.sort_ts = sessionSortTimestamp(r);
|
|
586
553
|
return row;
|
|
587
554
|
}
|
|
@@ -614,13 +581,53 @@ export function mergeCliSidebarMetadata(ui, meta) {
|
|
|
614
581
|
function sessionSourceIsWebui(row) {
|
|
615
582
|
return ['source_tag', 'raw_source', 'session_source', 'source'].some((k) => str(row[k]).trim().toLowerCase() === 'webui');
|
|
616
583
|
}
|
|
617
|
-
function sessionLineageIds(row) {
|
|
584
|
+
export function sessionLineageIds(row) {
|
|
618
585
|
const ids = new Set();
|
|
619
586
|
for (const key of ['session_id', '_lineage_root_id', '_lineage_tip_id'])
|
|
620
587
|
if (row[key])
|
|
621
588
|
ids.add(str(row[key]));
|
|
589
|
+
if (Array.isArray(row._lineage_ids))
|
|
590
|
+
for (const id of row._lineage_ids)
|
|
591
|
+
if (typeof id === 'string')
|
|
592
|
+
ids.add(id);
|
|
622
593
|
return ids;
|
|
623
594
|
}
|
|
595
|
+
/** The newest saved physical member owns UI metadata; listing and materialization use this same selection. */
|
|
596
|
+
export function latestLineageSidecar(ids, profile, lookup, profilesMatch) {
|
|
597
|
+
for (let i = ids.length - 1; i >= 0; i -= 1) {
|
|
598
|
+
const row = lookup(ids[i]);
|
|
599
|
+
if (row && profilesMatch(str(row.profile) || null, profile))
|
|
600
|
+
return row;
|
|
601
|
+
}
|
|
602
|
+
return undefined;
|
|
603
|
+
}
|
|
604
|
+
/** Receipt members are aliases of the current target. Keep UI metadata, never an old member's transcript counts. */
|
|
605
|
+
export function reconcileLocalSessionRows(rows, cli, profilesMatch) {
|
|
606
|
+
const byId = new Map(rows.map((row) => [str(row.session_id), row]));
|
|
607
|
+
const members = new Map();
|
|
608
|
+
const chosen = new Map();
|
|
609
|
+
for (const meta of cli) {
|
|
610
|
+
if (!Array.isArray(meta._lineage_ids))
|
|
611
|
+
continue;
|
|
612
|
+
const ids = meta._lineage_ids.filter((id) => typeof id === 'string');
|
|
613
|
+
for (const id of ids)
|
|
614
|
+
members.set(id, meta);
|
|
615
|
+
const row = latestLineageSidecar(ids, str(meta.profile) || null, (id) => byId.get(id), profilesMatch);
|
|
616
|
+
if (row)
|
|
617
|
+
chosen.set(str(meta.session_id), { row, meta });
|
|
618
|
+
}
|
|
619
|
+
const other = rows.filter((row) => { const meta = members.get(str(row.session_id)); return !meta || !profilesMatch(str(row.profile) || null, str(meta.profile) || null); });
|
|
620
|
+
for (const [target, { row, meta }] of chosen) {
|
|
621
|
+
const merged = mergeCliSidebarMetadata(row, meta);
|
|
622
|
+
if (str(row.session_id) !== target) {
|
|
623
|
+
merged.message_count = meta.message_count ?? 0;
|
|
624
|
+
merged.user_message_count = meta.user_message_count ?? 0;
|
|
625
|
+
merged.last_message_at = meta.last_message_at ?? meta.updated_at;
|
|
626
|
+
}
|
|
627
|
+
other.push({ ...merged, session_id: target });
|
|
628
|
+
}
|
|
629
|
+
return other;
|
|
630
|
+
}
|
|
624
631
|
/** Python `_dedupe_cli_sidebar_sessions_for_api`: additive state rows, keeping project-hidden background rows addressable. */
|
|
625
632
|
export function dedupeCliSidebarSessions(cli, represented, opts) {
|
|
626
633
|
const sf = str(opts.sourceFilter).trim().toLowerCase();
|
|
@@ -711,7 +718,11 @@ export function capRecentCliSessions(rows, cap = CLI_VISIBLE_SESSION_CAP) {
|
|
|
711
718
|
return true; seen += 1; return seen <= cap; });
|
|
712
719
|
}
|
|
713
720
|
function sessionHasServerVisibleMessages(row) {
|
|
714
|
-
|
|
721
|
+
// A validated local reset keeps its empty current target discoverable under the existing lineage identity.
|
|
722
|
+
if (row._lineage_root_id && row._lineage_tip_id)
|
|
723
|
+
return true;
|
|
724
|
+
// A worktree chat owns a directory on disk from creation; its row is where the user removes it (TAL-605).
|
|
725
|
+
if (sidebarMessageCount(row) > 0 || row.worktree_path)
|
|
715
726
|
return true;
|
|
716
727
|
const attention = row.attention;
|
|
717
728
|
if (attention && typeof attention === 'object' && attention.kind && num(attention.count) > 0)
|
|
@@ -744,15 +755,19 @@ function hiddenArchivedReferences(visible, archived) {
|
|
|
744
755
|
}
|
|
745
756
|
return references;
|
|
746
757
|
}
|
|
747
|
-
/** Python `_build_session_list_cache_payload`;
|
|
748
|
-
export function buildSessionListPayload(store, params) {
|
|
749
|
-
let webuiSessions = allSessions(store, { sidebarMetadataOnly: true }).map((r) => ({ ...r, is_cli_session: isCliSessionRow(r) }));
|
|
758
|
+
/** Python `_build_session_list_cache_payload`; of its orphaned-sidecar prunes only the imported one (#3238) applies. */
|
|
759
|
+
export async function buildSessionListPayload(store, params) {
|
|
760
|
+
let webuiSessions = (params.webuiRows ?? (await allSessions(store, { sidebarMetadataOnly: true }))).map((r) => ({ ...r, is_cli_session: isCliSessionRow(r) }));
|
|
761
|
+
const orphans = await params.pruneOrphanedImports?.(webuiSessions);
|
|
762
|
+
if (orphans?.size)
|
|
763
|
+
webuiSessions = webuiSessions.filter((r) => !orphans.has(str(r.session_id)));
|
|
750
764
|
// Before the state.db overlay below replaces the sidecar's own source fields, which the WebUI-born exception reads.
|
|
751
765
|
if (params.stateDbSources)
|
|
752
766
|
webuiSessions = withOwnerLocks(webuiSessions, params.stateDbSources);
|
|
753
767
|
let dedupedCli = [];
|
|
754
768
|
if (params.cliRows) {
|
|
755
769
|
const cliRows = params.cliRows.flatMap((r) => { const clean = sanitizeSessionRow(r, store, 'state.db'); return clean ? [clean] : []; });
|
|
770
|
+
webuiSessions = reconcileLocalSessionRows(webuiSessions, cliRows, params.profilesMatch);
|
|
756
771
|
const cliById = new Map(cliRows.map((r) => [str(r.session_id), r]));
|
|
757
772
|
webuiSessions = webuiSessions.map((s) => {
|
|
758
773
|
const meta = cliById.get(str(s.session_id));
|
|
@@ -778,9 +793,11 @@ export function buildSessionListPayload(store, params) {
|
|
|
778
793
|
for (const s of webuiSessions)
|
|
779
794
|
for (const id of sessionLineageIds(s))
|
|
780
795
|
represented.add(id);
|
|
781
|
-
dedupedCli = dedupeCliSidebarSessions(cliRows, represented, { showCli: params.showCliSessions, showCron: params.showCronSessions, showWebhook: params.showWebhookSessions, showKanban: params.showKanbanSessions, sourceFilter: params.sourceFilter ?? null, requestVisibilityOverrides: params.requestVisibilityOverrides })
|
|
782
|
-
|
|
783
|
-
|
|
796
|
+
dedupedCli = dedupeCliSidebarSessions(cliRows, represented, { showCli: params.showCliSessions, showCron: params.showCronSessions, showWebhook: params.showWebhookSessions, showKanban: params.showKanbanSessions, sourceFilter: params.sourceFilter ?? null, requestVisibilityOverrides: params.requestVisibilityOverrides });
|
|
797
|
+
const owners = params.stateDbSources ? params.stateDbSources(dedupedCli.map((r) => str(r.session_id))) : new Map();
|
|
798
|
+
// A sidecar-less foreign row whose owner refuses claiming is read-only, as its detail and mutations are; an
|
|
799
|
+
// unreadable owner read (null) locks every row, as it locks sidecars.
|
|
800
|
+
dedupedCli = withOwnerLocks(dedupedCli.map((r) => ({ ...r, read_only: !owners || !isClaimableCliSource(r, owners.get(str(r.session_id)) || str(r.source)), can_duplicate: false })), () => owners);
|
|
784
801
|
}
|
|
785
802
|
else {
|
|
786
803
|
webuiSessions = webuiSessions.filter((r) => !isCliSessionForSettings(r));
|
|
@@ -799,8 +816,12 @@ export function buildSessionListPayload(store, params) {
|
|
|
799
816
|
otherProfileCount = params.isolatedProfileMode ? 0 : merged.length - scoped.length;
|
|
800
817
|
}
|
|
801
818
|
const identity = params.gatewayIdentity ?? new Map();
|
|
802
|
-
const
|
|
803
|
-
|
|
819
|
+
const snapshots = new Set();
|
|
820
|
+
for (const parent of new Set(scoped.map((row) => str(row.parent_session_id)))) {
|
|
821
|
+
if (/^[a-z0-9_]+$/.test(parent) && (await store.loadMetadataOnly(parent))?.pre_compression_snapshot)
|
|
822
|
+
snapshots.add(parent);
|
|
823
|
+
}
|
|
824
|
+
const isPreCompressionSnapshotId = (sid) => snapshots.has(sid);
|
|
804
825
|
const dedupeOpts = { showPrevious: params.showPreviousMessagingSessions, identity, isPreCompressionSnapshotId };
|
|
805
826
|
let archivedScoped = keepLatestMessagingSessionPerSource([...scoped], dedupeOpts);
|
|
806
827
|
let visibleScoped = keepLatestMessagingSessionPerSource(scoped.filter((r) => !r.archived), dedupeOpts);
|
|
@@ -845,6 +866,7 @@ export function buildSessionListPayload(store, params) {
|
|
|
845
866
|
scheduled_sessions_truncated: params.showCronSessions && truncated.has('cron'),
|
|
846
867
|
webhook_session_count: visibleFiltered.filter((r) => sourceKind(r) === 'webhook').length,
|
|
847
868
|
webhook_sessions_truncated: params.showWebhookSessions && truncated.has('webhook'),
|
|
869
|
+
agent_storage: params.agentStorage ?? AGENT_STORAGE_OK,
|
|
848
870
|
include_archived: params.includeArchived,
|
|
849
871
|
archived_limit: params.archivedLimit,
|
|
850
872
|
archived_offset: params.archivedOffset,
|
|
@@ -944,6 +966,7 @@ export function sessionListResponse(payload, overlay, redactEnabled, now, worksp
|
|
|
944
966
|
scheduled_sessions_truncated: payload.scheduled_sessions_truncated,
|
|
945
967
|
webhook_session_count: payload.webhook_session_count,
|
|
946
968
|
webhook_sessions_truncated: payload.webhook_sessions_truncated,
|
|
969
|
+
agent_storage: payload.agent_storage,
|
|
947
970
|
};
|
|
948
971
|
if (payload.archived_limit !== null) {
|
|
949
972
|
body.archived_limit = Math.trunc(payload.archived_limit) || 0;
|
|
@@ -954,20 +977,7 @@ export function sessionListResponse(payload, overlay, redactEnabled, now, worksp
|
|
|
954
977
|
return { body, etag };
|
|
955
978
|
}
|
|
956
979
|
// ── search ────────────────────────────────────────────────────────────────
|
|
957
|
-
export
|
|
958
|
-
const content = message && typeof message === 'object' ? message.content : '';
|
|
959
|
-
if (Array.isArray(content))
|
|
960
|
-
return content.filter((p) => Boolean(p) && typeof p === 'object' && p.type === 'text').map((p) => str(p.text)).join(' ');
|
|
961
|
-
return str(content);
|
|
962
|
-
}
|
|
963
|
-
/** TAL-453: a query's distinct whitespace-separated terms, lowercased; a row matches when one field holds them all. */
|
|
964
|
-
export function sessionSearchTerms(query) {
|
|
965
|
-
return [...new Set(query.toLowerCase().split(/\s+/).filter(Boolean))];
|
|
966
|
-
}
|
|
967
|
-
export function sessionSearchMatches(text, terms) {
|
|
968
|
-
const lower = text.toLowerCase();
|
|
969
|
-
return terms.length > 0 && terms.every((term) => lower.includes(term));
|
|
970
|
-
}
|
|
980
|
+
export { sessionSearchMessageText, sessionSearchTerms, sessionSearchMatches } from './storage/search-text.js';
|
|
971
981
|
/** An excerpt of `text` centred on the earliest occurrence of any of `terms`. */
|
|
972
982
|
export function sessionSearchPreview(text, terms, maxLen = 124) {
|
|
973
983
|
const normalized = text.replace(/\s+/g, ' ').trim();
|