@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
|
/** Session, project, share, workspace, and file procedures. */
|
|
2
2
|
import { implement } from '@orpc/server';
|
|
3
|
-
import {
|
|
3
|
+
import { stateDbSessionReadAsync } from '../sessions/state-db.js';
|
|
4
4
|
import { sessionsContract, workspacesContract } from '@maudecode/talaria-web-contracts';
|
|
5
5
|
import { mkdirSync } from 'node:fs';
|
|
6
6
|
import { closeSync, existsSync, lstatSync, statSync } from 'node:fs';
|
|
@@ -66,8 +66,8 @@ function queryPositiveInt(value, fallback, maximum) {
|
|
|
66
66
|
}
|
|
67
67
|
const sanitizeError = sanitizePaths;
|
|
68
68
|
/** Python `_guard_request_session_visibility` for a body/query session id. */
|
|
69
|
-
function guardVisibility(ctx, sid) {
|
|
70
|
-
if (!ctx.deps.sessions.sessionIdVisible(sid))
|
|
69
|
+
async function guardVisibility(ctx, sid) {
|
|
70
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
|
|
71
71
|
throw new HttpError(404, 'Session not found');
|
|
72
72
|
}
|
|
73
73
|
/** Python `float(body["since"])` for the handoff dock: a unix time or numeric string; absent is null. */
|
|
@@ -80,13 +80,13 @@ function handoffSince(value) {
|
|
|
80
80
|
return n;
|
|
81
81
|
}
|
|
82
82
|
/** The handoff dock's session id and `since`, validated in the predecessor's order. */
|
|
83
|
-
function handoffInput(ctx, input) {
|
|
83
|
+
async function handoffInput(ctx, input) {
|
|
84
84
|
requireFields(input, 'session_id');
|
|
85
85
|
const sid = str(input.session_id).trim();
|
|
86
86
|
if (!sid)
|
|
87
87
|
throw new HttpError(400, 'session_id is required');
|
|
88
88
|
const since = handoffSince(input.since);
|
|
89
|
-
guardVisibility(ctx, sid);
|
|
89
|
+
await guardVisibility(ctx, sid);
|
|
90
90
|
return { sid, since };
|
|
91
91
|
}
|
|
92
92
|
function allProfilesEnabled(ctx, value) {
|
|
@@ -95,8 +95,8 @@ function allProfilesEnabled(ctx, value) {
|
|
|
95
95
|
/** Search inputs that select the sidebar rows rather than every stored session (TAL-308). */
|
|
96
96
|
const SIDEBAR_SEARCH_KEYS = ['project_id', 'sidebar_source', 'include_archived', 'exclude_hidden', 'show_cli_sessions', 'show_claude_code_sessions', 'show_cron_sessions', 'show_webhook_sessions', 'show_kanban_sessions'];
|
|
97
97
|
/** The `/api/sessions` row selection for a list or sidebar-search query (TAL-308 shares it). */
|
|
98
|
-
function sidebarListParams(ctx, input) {
|
|
99
|
-
const settings = ctx.deps.settings.load();
|
|
98
|
+
async function sidebarListParams(ctx, input) {
|
|
99
|
+
const settings = (await ctx.deps.settings.load());
|
|
100
100
|
const overrideKeys = ['show_cli_sessions', 'show_claude_code_sessions', 'show_cron_sessions', 'show_webhook_sessions', 'show_kanban_sessions'];
|
|
101
101
|
const sidebarSourceRaw = (input.sidebar_source ?? '').trim().toLowerCase();
|
|
102
102
|
return {
|
|
@@ -119,7 +119,7 @@ function sidebarListParams(ctx, input) {
|
|
|
119
119
|
export const sessionsRouter = os.router({
|
|
120
120
|
sessions: {
|
|
121
121
|
list: os.sessions.list.handler(({ input, context: { ctx } }) => run(async () => {
|
|
122
|
-
const { body, etag } = await ctx.deps.sessions.list(sidebarListParams(ctx, input));
|
|
122
|
+
const { body, etag } = await ctx.deps.sessions.list((await sidebarListParams(ctx, input)));
|
|
123
123
|
ctx.extraResponseHeaders = { etag };
|
|
124
124
|
if (ifNoneMatchMatches(ctx.header('if-none-match') ?? '', etag))
|
|
125
125
|
ctx.notModified = true;
|
|
@@ -132,19 +132,19 @@ export const sessionsRouter = os.router({
|
|
|
132
132
|
const opts = { content: (input.content ?? '1') === '1', depth, allProfiles: allProfilesEnabled(ctx, input.all_profiles) };
|
|
133
133
|
// TAL-308: any sidebar filter answers from the sidebar's own rows; without one the store-only search stays.
|
|
134
134
|
if (SIDEBAR_SEARCH_KEYS.some((k) => input[k] !== undefined)) {
|
|
135
|
-
return await ctx.deps.sessions.sidebarSearch(input.q ?? '', sidebarListParams(ctx, input), { ...opts, projectId: input.project_id?.trim() || null });
|
|
135
|
+
return await ctx.deps.sessions.sidebarSearch(input.q ?? '', (await sidebarListParams(ctx, input)), { ...opts, projectId: input.project_id?.trim() || null });
|
|
136
136
|
}
|
|
137
|
-
return ctx.deps.sessions.search(input.q ?? '', opts);
|
|
137
|
+
return await ctx.deps.sessions.search(input.q ?? '', opts);
|
|
138
138
|
})),
|
|
139
|
-
cleanup: os.sessions.cleanup.handler(({ context: { ctx } }) => run(() => ctx.deps.sessions.cleanup(false))),
|
|
140
|
-
cleanupZeroMessage: os.sessions.cleanupZeroMessage.handler(({ context: { ctx } }) => run(() => ctx.deps.sessions.cleanup(true))),
|
|
139
|
+
cleanup: os.sessions.cleanup.handler(({ context: { ctx } }) => run(async () => (await ctx.deps.sessions.cleanup(false)))),
|
|
140
|
+
cleanupZeroMessage: os.sessions.cleanupZeroMessage.handler(({ context: { ctx } }) => run(async () => (await ctx.deps.sessions.cleanup(true)))),
|
|
141
141
|
// TAL-627: each id runs the single-session route's own guards, lock and cleanup, one at a time; a failure becomes
|
|
142
142
|
// that id's result and the rest still run.
|
|
143
143
|
bulk: os.sessions.bulk.handler(async ({ input, context: { ctx } }) => {
|
|
144
144
|
const results = [];
|
|
145
145
|
for (const sid of input.session_ids) {
|
|
146
146
|
try {
|
|
147
|
-
guardVisibility(ctx, sid);
|
|
147
|
+
await guardVisibility(ctx, sid);
|
|
148
148
|
if (input.action === 'delete') {
|
|
149
149
|
const { state_db_cleanup_failed } = await ctx.deps.sessions.delete(sid);
|
|
150
150
|
results.push({ session_id: sid, ok: true, state_db_cleanup_failed: Boolean(state_db_cleanup_failed) });
|
|
@@ -159,7 +159,8 @@ export const sessionsRouter = os.router({
|
|
|
159
159
|
: error instanceof HttpFailure ? [error.status, error.message]
|
|
160
160
|
: error instanceof SessionNotFound ? [404, 'Session not found']
|
|
161
161
|
: [500, sanitizeError(error)];
|
|
162
|
-
|
|
162
|
+
const refused = error instanceof HttpFailure ? error.extra.refused : undefined;
|
|
163
|
+
results.push({ session_id: sid, ok: false, status, error: message, ...(refused ? { refused } : {}) });
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
166
|
return { results };
|
|
@@ -169,30 +170,43 @@ export const sessionsRouter = os.router({
|
|
|
169
170
|
// No visibility guard here: `detail()` answers 409 `session_profile_mismatch` so the frontend can switch to the owning profile.
|
|
170
171
|
get: os.session.get.handler(({ input, context: { ctx } }) => run(async () => {
|
|
171
172
|
await ctx.deps.sessions.deps.warmModelOptions?.();
|
|
173
|
+
await ctx.deps.turns.loadGoal(input.session_id.trim());
|
|
172
174
|
try {
|
|
173
|
-
return { session: ctx.deps.sessions.detail(input.session_id, input) };
|
|
175
|
+
return { session: (await ctx.deps.sessions.detail(input.session_id, input)) };
|
|
174
176
|
}
|
|
175
177
|
catch (error) {
|
|
176
178
|
// Runs left on the relay by a deletion that predates `clearRelayCompletions` clear when the id is next requested.
|
|
177
179
|
const sid = input.session_id.trim();
|
|
178
|
-
if (error instanceof HttpFailure && error.status === 404 && ctx.deps.sessionStore.wasDeleted(sid))
|
|
179
|
-
ctx.deps.relay.clearDeleted(sid, ctx.deps.activeProfile());
|
|
180
|
+
if (error instanceof HttpFailure && error.status === 404 && (await ctx.deps.sessionStore.wasDeleted(sid)))
|
|
181
|
+
(await ctx.deps.relay.clearDeleted(sid, ctx.deps.activeProfile()));
|
|
180
182
|
throw error;
|
|
181
183
|
}
|
|
182
184
|
})),
|
|
183
|
-
status: os.session.status.handler(({ input, context: { ctx } }) => run(() => {
|
|
185
|
+
status: os.session.status.handler(({ input, context: { ctx } }) => run(async () => {
|
|
184
186
|
if (!input.session_id)
|
|
185
187
|
throw new HttpError(400, 'Missing session_id');
|
|
186
|
-
guardVisibility(ctx, input.session_id);
|
|
187
|
-
return ctx.deps.sessions.status(input.session_id);
|
|
188
|
+
await guardVisibility(ctx, input.session_id);
|
|
189
|
+
return (await ctx.deps.sessions.status(input.session_id));
|
|
188
190
|
})),
|
|
189
|
-
|
|
191
|
+
contextDetail: os.session.contextDetail.handler(({ input, context: { ctx } }) => run(async () => {
|
|
192
|
+
await guardVisibility(ctx, input.session_id);
|
|
193
|
+
return ctx.deps.sessions.contextDetail(input.session_id, input.context_detail_key);
|
|
194
|
+
})),
|
|
195
|
+
usage: os.session.usage.handler(({ input, context: { ctx } }) => run(async () => {
|
|
190
196
|
if (!input.session_id)
|
|
191
197
|
throw new HttpError(400, 'Missing session_id');
|
|
192
|
-
guardVisibility(ctx, input.session_id);
|
|
193
|
-
return ctx.deps.sessions.usage(input.session_id);
|
|
198
|
+
await guardVisibility(ctx, input.session_id);
|
|
199
|
+
return (await ctx.deps.sessions.usage(input.session_id));
|
|
194
200
|
})),
|
|
201
|
+
executionModes: os.session.executionModes.handler(({ context: { ctx } }) => run(async () => ctx.deps.sessions.owner.modes(ctx.deps.activeProfile()))),
|
|
195
202
|
new: os.session.new.handler(({ input, context: { ctx } }) => run(async () => {
|
|
203
|
+
if (input.execution_mode === 'ignore_config' || input.execution_mode === 'safe') {
|
|
204
|
+
// The owner has no worktree flow; refuse it rather than silently start an ordinary chat.
|
|
205
|
+
if (input.worktree !== undefined && input.worktree !== false)
|
|
206
|
+
throw new HttpError(400, 'A diagnostic chat cannot start in a new worktree');
|
|
207
|
+
await ctx.deps.agentConfig.read(ctx.deps.profileHome(ctx.deps.activeProfile())).catch(() => undefined);
|
|
208
|
+
return { session: (await ctx.deps.sessions.createDiagnostic(input, input.execution_mode)) };
|
|
209
|
+
}
|
|
196
210
|
// Python: an invisible prev_session_id is ignored (the service drops it), never an error (#5420).
|
|
197
211
|
const profile = input.profile || null;
|
|
198
212
|
// The middleware warms only the cookie profile's config; new-session defaults read the target's synchronously.
|
|
@@ -213,8 +227,8 @@ export const sessionsRouter = os.router({
|
|
|
213
227
|
}
|
|
214
228
|
if (requested) {
|
|
215
229
|
try {
|
|
216
|
-
let base = input.workspace ? ctx.deps.sessions.resolveNewSessionWorkspace(input, null, profile) : null;
|
|
217
|
-
base ??= ctx.deps.workspaces.resolveTrusted(ctx.deps.workspaces.lastWorkspace(profile), profile);
|
|
230
|
+
let base = input.workspace ? (await ctx.deps.sessions.resolveNewSessionWorkspace(input, null, profile)) : null;
|
|
231
|
+
base ??= (await ctx.deps.workspaces.resolveTrusted((await ctx.deps.workspaces.lastWorkspace(profile)), profile));
|
|
218
232
|
const repo = base;
|
|
219
233
|
worktree = await ctx.deps.git.holdWrite(repo, () => ctx.deps.worktrees.create(repo));
|
|
220
234
|
}
|
|
@@ -232,67 +246,69 @@ export const sessionsRouter = os.router({
|
|
|
232
246
|
worktreeSkipped = error.message;
|
|
233
247
|
}
|
|
234
248
|
}
|
|
235
|
-
const s = ctx.deps.sessions.create(input, { worktree });
|
|
236
|
-
const payload = { session: ctx.deps.sessions.publicSession(s) };
|
|
249
|
+
const s = (await ctx.deps.sessions.create(input, { worktree }));
|
|
250
|
+
const payload = { session: (await ctx.deps.sessions.publicSession(s)) };
|
|
237
251
|
if (worktreeSkipped)
|
|
238
252
|
payload.worktree_skipped = worktreeSkipped;
|
|
239
253
|
return payload;
|
|
240
254
|
})),
|
|
241
255
|
rename: os.session.rename.handler(({ input, context: { ctx } }) => run(async () => {
|
|
242
|
-
guardVisibility(ctx, input.session_id);
|
|
256
|
+
await guardVisibility(ctx, input.session_id);
|
|
243
257
|
if (!input.title)
|
|
244
258
|
throw new HttpError(400, 'Missing required field(s): title');
|
|
245
|
-
return ctx.deps.sessions.rename(input.session_id, input.title);
|
|
259
|
+
return (await ctx.deps.sessions.rename(input.session_id, input.title));
|
|
246
260
|
})),
|
|
247
261
|
delete: os.session.delete.handler(({ input, context: { ctx } }) => run(async () => {
|
|
248
|
-
guardVisibility(ctx, input.session_id);
|
|
249
|
-
return ctx.deps.sessions.delete(input.session_id);
|
|
262
|
+
await guardVisibility(ctx, input.session_id);
|
|
263
|
+
return (await ctx.deps.sessions.delete(input.session_id));
|
|
250
264
|
})),
|
|
251
265
|
pin: os.session.pin.handler(({ input, context: { ctx } }) => run(async () => {
|
|
252
|
-
guardVisibility(ctx, input.session_id);
|
|
266
|
+
await guardVisibility(ctx, input.session_id);
|
|
253
267
|
return ctx.deps.sessions.pin(input.session_id, input.pinned ?? true);
|
|
254
268
|
})),
|
|
255
269
|
archive: os.session.archive.handler(({ input, context: { ctx } }) => run(async () => {
|
|
256
|
-
guardVisibility(ctx, input.session_id);
|
|
257
|
-
return ctx.deps.sessions.archive(input.session_id, input.archived ?? true);
|
|
270
|
+
await guardVisibility(ctx, input.session_id);
|
|
271
|
+
return (await ctx.deps.sessions.archive(input.session_id, input.archived ?? true));
|
|
258
272
|
})),
|
|
259
273
|
move: os.session.move.handler(({ input, context: { ctx } }) => run(async () => {
|
|
260
|
-
guardVisibility(ctx, input.session_id);
|
|
261
|
-
return ctx.deps.sessions.move(input.session_id, input.project_id || null);
|
|
274
|
+
await guardVisibility(ctx, input.session_id);
|
|
275
|
+
return (await ctx.deps.sessions.move(input.session_id, input.project_id || null));
|
|
262
276
|
})),
|
|
263
|
-
duplicate: os.session.duplicate.handler(({ input, context: { ctx } }) => run(() => {
|
|
277
|
+
duplicate: os.session.duplicate.handler(({ input, context: { ctx } }) => run(async () => {
|
|
264
278
|
if (!input.session_id)
|
|
265
279
|
throw new HttpError(400, 'session_id is required');
|
|
266
|
-
guardVisibility(ctx, input.session_id);
|
|
267
|
-
return ctx.deps.sessions.duplicate(input.session_id);
|
|
280
|
+
await guardVisibility(ctx, input.session_id);
|
|
281
|
+
return (await ctx.deps.sessions.duplicate(input.session_id));
|
|
268
282
|
})),
|
|
269
|
-
branch: os.session.branch.handler(({ input, context: { ctx } }) => run(() => {
|
|
270
|
-
guardVisibility(ctx, input.session_id);
|
|
271
|
-
return ctx.deps.sessions.branch(input.session_id, input);
|
|
283
|
+
branch: os.session.branch.handler(({ input, context: { ctx } }) => run(async () => {
|
|
284
|
+
await guardVisibility(ctx, input.session_id);
|
|
285
|
+
return (await ctx.deps.sessions.branch(input.session_id, input));
|
|
272
286
|
})),
|
|
273
287
|
truncate: os.session.truncate.handler(({ input, context: { ctx } }) => run(async () => {
|
|
274
|
-
guardVisibility(ctx, input.session_id);
|
|
275
|
-
|
|
288
|
+
await guardVisibility(ctx, input.session_id);
|
|
289
|
+
// A body without `confirm_deep_truncate` is a released App's, which asked on the device before sending it.
|
|
290
|
+
const hold = input.confirm_deep_truncate === undefined ? null : { confirmToken: input.confirm_deep_truncate ? input.confirm_token ?? null : null };
|
|
291
|
+
return (await ctx.deps.sessions.truncate(input.session_id, input.keep_count, hold));
|
|
276
292
|
})),
|
|
277
293
|
clear: os.session.clear.handler(({ input, context: { ctx } }) => run(async () => {
|
|
278
|
-
guardVisibility(ctx, input.session_id);
|
|
279
|
-
return ctx.deps.sessions.clear(input.session_id);
|
|
294
|
+
await guardVisibility(ctx, input.session_id);
|
|
295
|
+
return (await ctx.deps.sessions.clear(input.session_id));
|
|
280
296
|
})),
|
|
281
297
|
retry: os.session.retry.handler(({ input, context: { ctx } }) => run(async () => {
|
|
282
|
-
guardVisibility(ctx, input.session_id);
|
|
283
|
-
return ctx.deps.sessions.retry(input.session_id);
|
|
298
|
+
await guardVisibility(ctx, input.session_id);
|
|
299
|
+
return (await ctx.deps.sessions.retry(input.session_id));
|
|
284
300
|
})),
|
|
285
301
|
undo: os.session.undo.handler(({ input, context: { ctx } }) => run(async () => {
|
|
286
|
-
guardVisibility(ctx, input.session_id);
|
|
287
|
-
return ctx.deps.sessions.undo(input.session_id);
|
|
302
|
+
await guardVisibility(ctx, input.session_id);
|
|
303
|
+
return (await ctx.deps.sessions.undo(input.session_id));
|
|
288
304
|
})),
|
|
289
305
|
update: os.session.update.handler(({ input, context: { ctx } }) => run(async () => {
|
|
290
|
-
guardVisibility(ctx, input.session_id);
|
|
291
|
-
return ctx.deps.sessions.update(input.session_id, input);
|
|
306
|
+
await guardVisibility(ctx, input.session_id);
|
|
307
|
+
return (await ctx.deps.sessions.update(input.session_id, input));
|
|
292
308
|
})),
|
|
293
309
|
toolsets: os.session.toolsets.handler(({ input, context: { ctx } }) => run(async () => {
|
|
294
|
-
guardVisibility(ctx, input.session_id);
|
|
295
|
-
return ctx.deps.sessions.setToolsets(input.session_id, input.toolsets);
|
|
310
|
+
await guardVisibility(ctx, input.session_id);
|
|
311
|
+
return (await ctx.deps.sessions.setToolsets(input.session_id, input.toolsets));
|
|
296
312
|
})),
|
|
297
313
|
yoloGet: os.session.yoloGet.handler(({ input, context: { ctx } }) => run(() => ctx.deps.sessions.yolo(input.session_id))),
|
|
298
314
|
yoloSet: os.session.yoloSet.handler(({ input, context: { ctx } }) => run(async () => {
|
|
@@ -312,52 +328,52 @@ export const sessionsRouter = os.router({
|
|
|
312
328
|
const released = await ctx.deps.turns.respondApproval(sid, 'once', '', true);
|
|
313
329
|
return { ok: true, yolo_enabled: Boolean(released.yolo_enabled ?? ctx.deps.sessions.yolo(sid).yolo_enabled), ...(released.stale_cleared ? { stale_cleared: true } : {}) };
|
|
314
330
|
})),
|
|
315
|
-
import: os.session.import.handler(({ input, context: { ctx } }) => run(() => ctx.deps.sessions.import(input))),
|
|
331
|
+
import: os.session.import.handler(({ input, context: { ctx } }) => run(async () => (await ctx.deps.sessions.import(input)))),
|
|
316
332
|
regenerateTitle: os.session.regenerateTitle.handler(({ input, context: { ctx } }) => run(async () => {
|
|
317
333
|
const sid = input.session_id;
|
|
318
334
|
let session;
|
|
319
335
|
try {
|
|
320
|
-
session = ctx.deps.sessionStore.get(sid);
|
|
336
|
+
session = (await ctx.deps.sessionStore.get(sid));
|
|
321
337
|
}
|
|
322
338
|
catch {
|
|
323
339
|
throw new HttpError(404, 'Session not found');
|
|
324
340
|
}
|
|
325
|
-
if (ctx.deps.sessions.isReadOnly(session) || ctx.deps.sessions.isSubagentViewOnly(sid))
|
|
341
|
+
if ((await ctx.deps.sessions.isReadOnly(session)) || (await ctx.deps.sessions.isSubagentViewOnly(sid)))
|
|
326
342
|
throw new HttpError(403, 'Read-only imported sessions cannot regenerate titles');
|
|
327
343
|
const generated = await ctx.deps.turns.generateTitle(session, { preferLatest: Boolean(input.prefer_latest) });
|
|
328
344
|
if (!generated.title)
|
|
329
345
|
throw new HttpError(422, `Could not generate a better title (${generated.status || 'empty'})`);
|
|
330
346
|
const current = await ctx.deps.sessions.persistGeneratedTitle(sid, generated.title, 'session_title_regenerate');
|
|
331
|
-
return { session: ctx.deps.sessions.wireRow(current), title: current.title, status: generated.status, raw_preview: generated.rawPreview.slice(0, 240) };
|
|
347
|
+
return { session: (await ctx.deps.sessions.wireRow(current)), title: current.title, status: generated.status, raw_preview: generated.rawPreview.slice(0, 240) };
|
|
332
348
|
})),
|
|
333
|
-
recoveryAudit: os.session.recoveryAudit.handler(({ context: { ctx } }) => run(() => ctx.deps.sessions.recoveryAudit())),
|
|
349
|
+
recoveryAudit: os.session.recoveryAudit.handler(({ context: { ctx } }) => run(async () => (await ctx.deps.sessions.recoveryAudit()))),
|
|
334
350
|
recoveryRepairSafe: os.session.recoveryRepairSafe.handler(({ context: { ctx } }) => run(async () => {
|
|
335
351
|
const result = await ctx.deps.sessions.recoveryRepairSafe();
|
|
336
352
|
if (!result.clean)
|
|
337
353
|
throw new RawResponse(409, result);
|
|
338
354
|
return result;
|
|
339
355
|
})),
|
|
340
|
-
lineageReport: os.session.lineageReport.handler(({ input, context: { ctx } }) => run(() => {
|
|
356
|
+
lineageReport: os.session.lineageReport.handler(({ input, context: { ctx } }) => run(async () => {
|
|
341
357
|
const sid = input.session_id ?? '';
|
|
342
358
|
if (!sid)
|
|
343
359
|
throw new HttpError(400, 'session_id required');
|
|
344
|
-
const report = ctx.deps.sessions.lineageReport(sid);
|
|
360
|
+
const report = await ctx.deps.sessions.lineageReport(sid);
|
|
345
361
|
if (!report.found)
|
|
346
362
|
throw new HttpError(404, 'Session not found');
|
|
347
363
|
return report;
|
|
348
364
|
})),
|
|
349
|
-
compressionRecoveryStart: os.session.compressionRecoveryStart.handler(({ input, context: { ctx } }) => run(() => {
|
|
365
|
+
compressionRecoveryStart: os.session.compressionRecoveryStart.handler(({ input, context: { ctx } }) => run(async () => {
|
|
350
366
|
requireFields(input, 'session_id');
|
|
351
367
|
const sid = str(input.session_id).trim();
|
|
352
368
|
if (!sid)
|
|
353
369
|
throw new HttpError(400, 'session_id is required');
|
|
354
|
-
return ctx.deps.sessions.compressionRecoveryStart(sid);
|
|
370
|
+
return (await ctx.deps.sessions.compressionRecoveryStart(sid));
|
|
355
371
|
})),
|
|
356
372
|
// TAL-255: the iOS `/compress` route joins or starts the session's compression job and answers with its result.
|
|
357
373
|
compress: os.session.compress.handler(({ input, context: { ctx } }) => run(async () => {
|
|
358
374
|
requireFields(input, 'session_id');
|
|
359
375
|
const sid = str(input.session_id).trim();
|
|
360
|
-
guardVisibility(ctx, sid);
|
|
376
|
+
await guardVisibility(ctx, sid);
|
|
361
377
|
const job = await ctx.deps.sessions.startCompression(sid, input.focus_topic || input.topic);
|
|
362
378
|
await job.done;
|
|
363
379
|
if (job.status === 'error')
|
|
@@ -367,56 +383,56 @@ export const sessionsRouter = os.router({
|
|
|
367
383
|
compressStart: os.session.compressStart.handler(({ input, context: { ctx } }) => run(async () => {
|
|
368
384
|
requireFields(input, 'session_id');
|
|
369
385
|
const sid = str(input.session_id).trim();
|
|
370
|
-
guardVisibility(ctx, sid);
|
|
386
|
+
await guardVisibility(ctx, sid);
|
|
371
387
|
return compressionStatusPayload(await ctx.deps.sessions.startCompression(sid, input.focus_topic || input.topic));
|
|
372
388
|
})),
|
|
373
389
|
// TAL-258: the handoff dock. Rounds decides when to offer it; the summary is generated and appended to the transcript.
|
|
374
|
-
conversationRounds: os.session.conversationRounds.handler(({ input, context: { ctx } }) => run(() => {
|
|
375
|
-
const { sid, since } = handoffInput(ctx, input);
|
|
376
|
-
return ctx.deps.sessions.conversationRounds(sid, since);
|
|
390
|
+
conversationRounds: os.session.conversationRounds.handler(({ input, context: { ctx } }) => run(async () => {
|
|
391
|
+
const { sid, since } = (await handoffInput(ctx, input));
|
|
392
|
+
return (await ctx.deps.sessions.conversationRounds(sid, since));
|
|
377
393
|
})),
|
|
378
|
-
handoffSummary: os.session.handoffSummary.handler(({ input, context: { ctx } }) => run(() => {
|
|
379
|
-
const { sid, since } = handoffInput(ctx, input);
|
|
380
|
-
return ctx.deps.sessions.handoffSummary(sid, since);
|
|
394
|
+
handoffSummary: os.session.handoffSummary.handler(({ input, context: { ctx } }) => run(async () => {
|
|
395
|
+
const { sid, since } = (await handoffInput(ctx, input));
|
|
396
|
+
return (await ctx.deps.sessions.handoffSummary(sid, since));
|
|
381
397
|
})),
|
|
382
|
-
compressStatus: os.session.compressStatus.handler(({ input, context: { ctx } }) => run(() => {
|
|
398
|
+
compressStatus: os.session.compressStatus.handler(({ input, context: { ctx } }) => run(async () => {
|
|
383
399
|
const sid = input.session_id.trim();
|
|
384
400
|
if (!sid)
|
|
385
401
|
throw new HttpError(400, 'session_id is required');
|
|
386
|
-
guardVisibility(ctx, sid);
|
|
387
|
-
const job = ctx.deps.sessions.compressionJob(sid);
|
|
402
|
+
await guardVisibility(ctx, sid);
|
|
403
|
+
const job = (await ctx.deps.sessions.compressionJob(sid));
|
|
388
404
|
return (job ? compressionStatusPayload(job) : { ok: true, status: 'idle', session_id: sid });
|
|
389
405
|
})),
|
|
390
|
-
draftGet: os.session.draftGet.handler(({ input, context: { ctx } }) => run(() => {
|
|
391
|
-
guardVisibility(ctx, input.session_id);
|
|
392
|
-
return ctx.deps.sessions.readDraft(input.session_id);
|
|
406
|
+
draftGet: os.session.draftGet.handler(({ input, context: { ctx } }) => run(async () => {
|
|
407
|
+
await guardVisibility(ctx, input.session_id);
|
|
408
|
+
return (await ctx.deps.sessions.readDraft(input.session_id));
|
|
393
409
|
})),
|
|
394
410
|
draftSave: os.session.draftSave.handler(({ input, context: { ctx } }) => run(async () => {
|
|
395
|
-
guardVisibility(ctx, input.session_id);
|
|
396
|
-
return ctx.deps.sessions.writeDraft(input);
|
|
411
|
+
await guardVisibility(ctx, input.session_id);
|
|
412
|
+
return (await ctx.deps.sessions.writeDraft(input));
|
|
397
413
|
})),
|
|
398
|
-
anchorSceneGet: os.session.anchorSceneGet.handler(({ input, context: { ctx } }) => run(() => {
|
|
399
|
-
guardVisibility(ctx, input.session_id);
|
|
400
|
-
return ctx.deps.sessions.readAnchorScene(input);
|
|
414
|
+
anchorSceneGet: os.session.anchorSceneGet.handler(({ input, context: { ctx } }) => run(async () => {
|
|
415
|
+
await guardVisibility(ctx, input.session_id);
|
|
416
|
+
return (await ctx.deps.sessions.readAnchorScene(input));
|
|
401
417
|
})),
|
|
402
|
-
toolResult: os.session.toolResult.handler(({ input, context: { ctx } }) => run(() => {
|
|
403
|
-
guardVisibility(ctx, input.session_id);
|
|
404
|
-
return ctx.deps.sessions.readToolResult(input);
|
|
418
|
+
toolResult: os.session.toolResult.handler(({ input, context: { ctx } }) => run(async () => {
|
|
419
|
+
await guardVisibility(ctx, input.session_id);
|
|
420
|
+
return (await ctx.deps.sessions.readToolResult(input));
|
|
405
421
|
})),
|
|
406
422
|
anchorSceneSave: os.session.anchorSceneSave.handler(({ input, context: { ctx } }) => run(async () => {
|
|
407
|
-
guardVisibility(ctx, input.session_id);
|
|
408
|
-
return ctx.deps.sessions.saveAnchorScene(input);
|
|
423
|
+
await guardVisibility(ctx, input.session_id);
|
|
424
|
+
return (await ctx.deps.sessions.saveAnchorScene(input));
|
|
409
425
|
})),
|
|
410
426
|
},
|
|
411
427
|
projects: {
|
|
412
|
-
list: os.projects.list.handler(({ input, context: { ctx } }) => run(() => {
|
|
428
|
+
list: os.projects.list.handler(({ input, context: { ctx } }) => run(async () => {
|
|
413
429
|
const activeProfile = ctx.deps.activeProfile();
|
|
414
|
-
const all = ctx.deps.projects.load();
|
|
430
|
+
const all = (await ctx.deps.projects.load());
|
|
415
431
|
const allProfiles = allProfilesEnabled(ctx, input.all_profiles);
|
|
416
432
|
const scoped = allProfiles ? all : all.filter((p) => ctx.deps.profilesMatch(p.profile ?? null, activeProfile));
|
|
417
433
|
return { projects: scoped, all_profiles: allProfiles, active_profile: activeProfile, other_profile_count: allProfiles || ctx.deps.isolatedProfileMode() ? 0 : all.length - scoped.length };
|
|
418
434
|
})),
|
|
419
|
-
create: os.projects.create.handler(({ input, context: { ctx } }) => run(() => {
|
|
435
|
+
create: os.projects.create.handler(({ input, context: { ctx } }) => run(async () => {
|
|
420
436
|
const name = input.name.trim().slice(0, 128);
|
|
421
437
|
if (!name)
|
|
422
438
|
throw new HttpError(400, 'name required');
|
|
@@ -426,43 +442,43 @@ export const sessionsRouter = os.router({
|
|
|
426
442
|
const requested = (input.profile ?? '').trim();
|
|
427
443
|
if (requested && requested !== 'default' && !/^[a-z0-9][a-z0-9_-]{0,63}$/.test(requested))
|
|
428
444
|
throw new HttpError(400, 'invalid profile');
|
|
429
|
-
const projects = ctx.deps.projects.load();
|
|
430
445
|
const proj = { project_id: randomUUID().replace(/-/g, '').slice(0, 12), name, color, profile: requested || ctx.deps.activeProfile() || 'default', created_at: ctx.deps.auth.now() };
|
|
431
|
-
projects.push(proj);
|
|
432
|
-
ctx.deps.projects.save(projects);
|
|
446
|
+
await ctx.deps.projects.mutate((projects) => { projects.push(proj); });
|
|
433
447
|
ctx.deps.events.publish('project_create', { profile: proj.profile });
|
|
434
448
|
return { ok: true, project: proj };
|
|
435
449
|
})),
|
|
436
|
-
rename: os.projects.rename.handler(({ input, context: { ctx } }) => run(() => {
|
|
437
|
-
const projects = ctx.deps.projects.load();
|
|
438
|
-
const proj = projects.find((p) => p.project_id === input.project_id);
|
|
450
|
+
rename: os.projects.rename.handler(({ input, context: { ctx } }) => run(async () => {
|
|
439
451
|
const activeProfile = ctx.deps.activeProfile();
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
if (color
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
452
|
+
const proj = await ctx.deps.projects.mutate((projects) => {
|
|
453
|
+
const proj = projects.find((p) => p.project_id === input.project_id);
|
|
454
|
+
if (!proj || !ctx.deps.profilesMatch(proj.profile ?? null, activeProfile))
|
|
455
|
+
throw new HttpError(404, 'Project not found');
|
|
456
|
+
requireFields(input, 'project_id', 'name');
|
|
457
|
+
proj.name = input.name.trim().slice(0, 128);
|
|
458
|
+
if ('color' in input) {
|
|
459
|
+
const color = input.color ?? null;
|
|
460
|
+
if (color && !/^#[0-9a-fA-F]{3,8}$/.test(color))
|
|
461
|
+
throw new HttpError(400, 'Invalid color format');
|
|
462
|
+
proj.color = color;
|
|
463
|
+
}
|
|
464
|
+
return proj;
|
|
465
|
+
});
|
|
451
466
|
ctx.deps.events.publish('project_rename', { profile: activeProfile });
|
|
452
467
|
return { ok: true, project: proj };
|
|
453
468
|
})),
|
|
454
|
-
delete: os.projects.delete.handler(({ input, context: { ctx } }) => run(() => {
|
|
455
|
-
let projects = ctx.deps.projects.load();
|
|
456
|
-
const proj = projects.find((p) => p.project_id === input.project_id);
|
|
469
|
+
delete: os.projects.delete.handler(({ input, context: { ctx } }) => run(async () => {
|
|
457
470
|
const activeProfile = ctx.deps.activeProfile();
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
471
|
+
await ctx.deps.projects.mutate((projects) => {
|
|
472
|
+
const position = projects.findIndex((p) => p.project_id === input.project_id);
|
|
473
|
+
const proj = projects[position];
|
|
474
|
+
if (!proj || !ctx.deps.profilesMatch(proj.profile ?? null, activeProfile))
|
|
475
|
+
throw new HttpError(404, 'Project not found');
|
|
476
|
+
projects.splice(position, 1);
|
|
477
|
+
});
|
|
462
478
|
const store = ctx.deps.sessionStore;
|
|
463
479
|
const activeIds = ctx.deps.sessions.deps.runtime.activeStreamIds;
|
|
464
480
|
try {
|
|
465
|
-
for (const entry of store.readIndexEntries()) {
|
|
481
|
+
for (const entry of (await store.readIndexEntries())) {
|
|
466
482
|
if (entry.project_id !== input.project_id)
|
|
467
483
|
continue;
|
|
468
484
|
const sid = str(entry.session_id);
|
|
@@ -474,9 +490,9 @@ export const sessionsRouter = os.router({
|
|
|
474
490
|
continue;
|
|
475
491
|
}
|
|
476
492
|
}
|
|
477
|
-
const s = store.get(sid);
|
|
493
|
+
const s = (await store.get(sid));
|
|
478
494
|
s.project_id = null;
|
|
479
|
-
store.save(s);
|
|
495
|
+
await store.save(s);
|
|
480
496
|
}
|
|
481
497
|
catch { /* one slow or failing session never aborts the request */ }
|
|
482
498
|
}
|
|
@@ -501,36 +517,36 @@ export const sessionsRouter = os.router({
|
|
|
501
517
|
const bound = str(session?.bound_profile).trim() || null;
|
|
502
518
|
return relayCall(() => Promise.resolve(ctx.deps.relay.presence.update(input, ctx.deps.isRootProfile(bound ?? ctx.deps.activeProfile()) ? 'default' : (bound ?? ctx.deps.activeProfile()))));
|
|
503
519
|
}),
|
|
504
|
-
viewed: os.talaria.viewed.handler(({ input, context: { ctx } }) => run(() => {
|
|
505
|
-
ctx.deps.relay.markViewed(input.session_id.trim());
|
|
520
|
+
viewed: os.talaria.viewed.handler(({ input, context: { ctx } }) => run(async () => {
|
|
521
|
+
await ctx.deps.relay.markViewed(input.session_id.trim());
|
|
506
522
|
return { ok: true };
|
|
507
523
|
})),
|
|
508
524
|
},
|
|
509
525
|
share: {
|
|
510
|
-
create: os.share.create.handler(({ input, context: { ctx } }) => run(() => {
|
|
526
|
+
create: os.share.create.handler(({ input, context: { ctx } }) => run(async () => {
|
|
511
527
|
const sid = input.session_id.trim();
|
|
512
528
|
if (!sid)
|
|
513
529
|
throw new HttpError(400, 'session_id is required');
|
|
514
|
-
return ctx.deps.sessions.createShare(sid);
|
|
530
|
+
return (await ctx.deps.sessions.createShare(sid));
|
|
515
531
|
})),
|
|
516
|
-
revoke: os.share.revoke.handler(({ input, context: { ctx } }) => run(() => {
|
|
532
|
+
revoke: os.share.revoke.handler(({ input, context: { ctx } }) => run(async () => {
|
|
517
533
|
const sid = input.session_id.trim();
|
|
518
534
|
if (!sid)
|
|
519
535
|
throw new HttpError(400, 'session_id is required');
|
|
520
|
-
return ctx.deps.sessions.revokeShare(sid);
|
|
536
|
+
return (await ctx.deps.sessions.revokeShare(sid));
|
|
521
537
|
})),
|
|
522
|
-
read: os.share.read.handler(({ input, context: { ctx } }) => run(() => {
|
|
538
|
+
read: os.share.read.handler(({ input, context: { ctx } }) => run(async () => {
|
|
523
539
|
ctx.extraResponseHeaders = { 'x-robots-tag': 'noindex, nofollow' };
|
|
524
|
-
return ctx.deps.sessions.loadShare(input.token.trim());
|
|
540
|
+
return (await ctx.deps.sessions.loadShare(input.token.trim()));
|
|
525
541
|
})),
|
|
526
542
|
},
|
|
527
543
|
workspaces: {
|
|
528
|
-
list: os.workspaces.list.handler(({ context: { ctx } }) => run(() => {
|
|
544
|
+
list: os.workspaces.list.handler(({ context: { ctx } }) => run(async () => {
|
|
529
545
|
const profile = ctx.deps.activeProfile();
|
|
530
|
-
return { workspaces: ctx.deps.workspaces.load(profile), last: ctx.deps.workspaces.lastWorkspace(profile), terminal_remote_backend: ctx.deps.features().terminal_remote_backend };
|
|
546
|
+
return { workspaces: (await ctx.deps.workspaces.load(profile)), last: (await ctx.deps.workspaces.lastWorkspace(profile)), terminal_remote_backend: ctx.deps.features().terminal_remote_backend };
|
|
531
547
|
})),
|
|
532
|
-
suggest: os.workspaces.suggest.handler(({ input, context: { ctx } }) => run(() => ({ suggestions: ctx.deps.workspaces.suggest(input.prefix ?? '', 12, ctx.deps.activeProfile()), prefix: input.prefix ?? '' }))),
|
|
533
|
-
add: os.workspaces.add.handler(({ input, context: { ctx } }) => run(() => {
|
|
548
|
+
suggest: os.workspaces.suggest.handler(({ input, context: { ctx } }) => run(async () => ({ suggestions: (await ctx.deps.workspaces.suggest(input.prefix ?? '', 12, ctx.deps.activeProfile())), prefix: input.prefix ?? '' }))),
|
|
549
|
+
add: os.workspaces.add.handler(({ input, context: { ctx } }) => run(async () => {
|
|
534
550
|
const ws = ctx.deps.workspaces;
|
|
535
551
|
const pathStr = stripSurroundingQuotes(input.path.trim());
|
|
536
552
|
const name = (input.name ?? '').trim();
|
|
@@ -569,42 +585,42 @@ export const sessionsRouter = os.router({
|
|
|
569
585
|
catch (error) {
|
|
570
586
|
throw new HttpError(400, error.message);
|
|
571
587
|
}
|
|
572
|
-
const list = ws.load(profile);
|
|
588
|
+
const list = (await ws.load(profile));
|
|
573
589
|
if (list.some((w) => w.path === p))
|
|
574
590
|
throw new HttpError(400, 'Workspace already in list');
|
|
575
591
|
list.push({ path: p, name: name || basename(p) });
|
|
576
|
-
ws.save(list, profile);
|
|
592
|
+
await ws.save(list, profile);
|
|
577
593
|
return { ok: true, workspaces: list };
|
|
578
594
|
})),
|
|
579
|
-
remove: os.workspaces.remove.handler(({ input, context: { ctx } }) => run(() => {
|
|
595
|
+
remove: os.workspaces.remove.handler(({ input, context: { ctx } }) => run(async () => {
|
|
580
596
|
const pathStr = input.path.trim();
|
|
581
597
|
if (!pathStr)
|
|
582
598
|
throw new HttpError(400, 'path is required');
|
|
583
599
|
const profile = ctx.deps.activeProfile();
|
|
584
|
-
const list = ctx.deps.workspaces.load(profile).filter((w) => w.path !== pathStr);
|
|
585
|
-
ctx.deps.workspaces.save(list, profile);
|
|
600
|
+
const list = (await ctx.deps.workspaces.load(profile)).filter((w) => w.path !== pathStr);
|
|
601
|
+
await ctx.deps.workspaces.save(list, profile);
|
|
586
602
|
return { ok: true, workspaces: list };
|
|
587
603
|
})),
|
|
588
|
-
rename: os.workspaces.rename.handler(({ input, context: { ctx } }) => run(() => {
|
|
604
|
+
rename: os.workspaces.rename.handler(({ input, context: { ctx } }) => run(async () => {
|
|
589
605
|
const pathStr = input.path.trim();
|
|
590
606
|
const name = input.name.trim();
|
|
591
607
|
if (!pathStr || !name)
|
|
592
608
|
throw new HttpError(400, 'path and name are required');
|
|
593
609
|
const profile = ctx.deps.activeProfile();
|
|
594
|
-
const list = ctx.deps.workspaces.load(profile);
|
|
610
|
+
const list = (await ctx.deps.workspaces.load(profile));
|
|
595
611
|
const entry = list.find((w) => w.path === pathStr);
|
|
596
612
|
if (!entry)
|
|
597
613
|
throw new HttpError(404, 'Workspace not found');
|
|
598
614
|
entry.name = name;
|
|
599
|
-
ctx.deps.workspaces.save(list, profile);
|
|
615
|
+
await ctx.deps.workspaces.save(list, profile);
|
|
600
616
|
return { ok: true, workspaces: list };
|
|
601
617
|
})),
|
|
602
|
-
reorder: os.workspaces.reorder.handler(({ input, context: { ctx } }) => run(() => {
|
|
618
|
+
reorder: os.workspaces.reorder.handler(({ input, context: { ctx } }) => run(async () => {
|
|
603
619
|
const paths = input.paths;
|
|
604
620
|
if (!Array.isArray(paths) || !paths.length)
|
|
605
621
|
throw new HttpError(400, 'paths is required and must be a list');
|
|
606
622
|
const profile = ctx.deps.activeProfile();
|
|
607
|
-
const list = ctx.deps.workspaces.load(profile);
|
|
623
|
+
const list = (await ctx.deps.workspaces.load(profile));
|
|
608
624
|
const byPath = new Map(list.map((w) => [w.path, w]));
|
|
609
625
|
const reordered = [];
|
|
610
626
|
const seen = new Set();
|
|
@@ -619,18 +635,18 @@ export const sessionsRouter = os.router({
|
|
|
619
635
|
for (const w of list)
|
|
620
636
|
if (!seen.has(w.path))
|
|
621
637
|
reordered.push(w);
|
|
622
|
-
ctx.deps.workspaces.save(reordered, profile);
|
|
638
|
+
await ctx.deps.workspaces.save(reordered, profile);
|
|
623
639
|
return { ok: true, workspaces: reordered };
|
|
624
640
|
})),
|
|
625
641
|
},
|
|
626
642
|
files: {
|
|
627
|
-
list: os.files.list.handler(({ input, context: { ctx } }) => run(() => {
|
|
643
|
+
list: os.files.list.handler(({ input, context: { ctx } }) => run(async () => {
|
|
628
644
|
if (!input.session_id)
|
|
629
645
|
throw new HttpError(400, 'session_id is required');
|
|
630
|
-
guardVisibility(ctx, input.session_id);
|
|
646
|
+
await guardVisibility(ctx, input.session_id);
|
|
631
647
|
// Python `_handle_list` resolved the workspace directly and answered 404 with the trust error; the POST file ops
|
|
632
648
|
// keep `get_session_for_file_ops`' lenient fallback.
|
|
633
|
-
const s = fileOpsSession(ctx, input.session_id, { strictWorkspace: true });
|
|
649
|
+
const s = (await fileOpsSession(ctx, input.session_id, { strictWorkspace: true }));
|
|
634
650
|
const rel = input.path ?? '.';
|
|
635
651
|
try {
|
|
636
652
|
const entries = listDir(s.workspace, rel);
|
|
@@ -640,11 +656,11 @@ export const sessionsRouter = os.router({
|
|
|
640
656
|
throw fileError(error, 404);
|
|
641
657
|
}
|
|
642
658
|
})),
|
|
643
|
-
read: os.files.read.handler(({ input, context: { ctx } }) => run(() => {
|
|
659
|
+
read: os.files.read.handler(({ input, context: { ctx } }) => run(async () => {
|
|
644
660
|
if (!input.session_id)
|
|
645
661
|
throw new HttpError(400, 'session_id is required');
|
|
646
|
-
guardVisibility(ctx, input.session_id);
|
|
647
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
662
|
+
await guardVisibility(ctx, input.session_id);
|
|
663
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
648
664
|
if (!input.path)
|
|
649
665
|
throw new HttpError(400, 'path is required');
|
|
650
666
|
try {
|
|
@@ -655,9 +671,9 @@ export const sessionsRouter = os.router({
|
|
|
655
671
|
throw fileError(error, 404);
|
|
656
672
|
}
|
|
657
673
|
})),
|
|
658
|
-
save: os.files.save.handler(({ input, context: { ctx } }) => run(() => {
|
|
674
|
+
save: os.files.save.handler(({ input, context: { ctx } }) => run(async () => {
|
|
659
675
|
requireFields(input, 'session_id', 'path');
|
|
660
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
676
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
661
677
|
try {
|
|
662
678
|
if (['.docx', '.xlsx', '.pptx'].includes(extname(input.path).toLowerCase()))
|
|
663
679
|
throw new HttpError(400, 'Office documents cannot be saved from the Web UI');
|
|
@@ -684,9 +700,9 @@ export const sessionsRouter = os.router({
|
|
|
684
700
|
throw fileError(error);
|
|
685
701
|
}
|
|
686
702
|
})),
|
|
687
|
-
create: os.files.create.handler(({ input, context: { ctx } }) => run(() => {
|
|
703
|
+
create: os.files.create.handler(({ input, context: { ctx } }) => run(async () => {
|
|
688
704
|
requireFields(input, 'session_id', 'path');
|
|
689
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
705
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
690
706
|
try {
|
|
691
707
|
const root = s.workspace;
|
|
692
708
|
assertWorkspaceFree(ctx, root);
|
|
@@ -709,9 +725,9 @@ export const sessionsRouter = os.router({
|
|
|
709
725
|
throw fileError(error);
|
|
710
726
|
}
|
|
711
727
|
})),
|
|
712
|
-
createDir: os.files.createDir.handler(({ input, context: { ctx } }) => run(() => {
|
|
728
|
+
createDir: os.files.createDir.handler(({ input, context: { ctx } }) => run(async () => {
|
|
713
729
|
requireFields(input, 'session_id', 'path');
|
|
714
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
730
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
715
731
|
try {
|
|
716
732
|
const root = s.workspace;
|
|
717
733
|
assertWorkspaceFree(ctx, root);
|
|
@@ -725,9 +741,9 @@ export const sessionsRouter = os.router({
|
|
|
725
741
|
throw fileError(error);
|
|
726
742
|
}
|
|
727
743
|
})),
|
|
728
|
-
delete: os.files.delete.handler(({ input, context: { ctx } }) => run(() => {
|
|
744
|
+
delete: os.files.delete.handler(({ input, context: { ctx } }) => run(async () => {
|
|
729
745
|
requireFields(input, 'session_id', 'path');
|
|
730
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
746
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
731
747
|
try {
|
|
732
748
|
const root = s.workspace;
|
|
733
749
|
assertWorkspaceFree(ctx, root);
|
|
@@ -749,9 +765,9 @@ export const sessionsRouter = os.router({
|
|
|
749
765
|
throw fileError(error);
|
|
750
766
|
}
|
|
751
767
|
})),
|
|
752
|
-
rename: os.files.rename.handler(({ input, context: { ctx } }) => run(() => {
|
|
768
|
+
rename: os.files.rename.handler(({ input, context: { ctx } }) => run(async () => {
|
|
753
769
|
requireFields(input, 'session_id', 'path', 'new_name');
|
|
754
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
770
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
755
771
|
try {
|
|
756
772
|
const root = s.workspace;
|
|
757
773
|
assertWorkspaceFree(ctx, root);
|
|
@@ -776,10 +792,10 @@ export const sessionsRouter = os.router({
|
|
|
776
792
|
throw fileError(error);
|
|
777
793
|
}
|
|
778
794
|
})),
|
|
779
|
-
move: os.files.move.handler(({ input, context: { ctx } }) => run(() => {
|
|
795
|
+
move: os.files.move.handler(({ input, context: { ctx } }) => run(async () => {
|
|
780
796
|
requireFields({ ...input, dest_dir: input.dest_dir ?? input.destination }, 'session_id', 'path', 'dest_dir');
|
|
781
797
|
const destDirRaw = (input.dest_dir ?? input.destination ?? '.').trim() || '.';
|
|
782
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
798
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
783
799
|
try {
|
|
784
800
|
const root = s.workspace;
|
|
785
801
|
assertWorkspaceFree(ctx, root);
|
|
@@ -812,7 +828,7 @@ export const sessionsRouter = os.router({
|
|
|
812
828
|
})),
|
|
813
829
|
reveal: os.files.reveal.handler(({ input, context: { ctx } }) => run(async () => {
|
|
814
830
|
requireFields(input, 'session_id', 'path');
|
|
815
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
831
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
816
832
|
try {
|
|
817
833
|
const target = safeResolve(s.workspace, input.path);
|
|
818
834
|
if (!existsSync(target))
|
|
@@ -831,9 +847,9 @@ export const sessionsRouter = os.router({
|
|
|
831
847
|
throw fileError(error);
|
|
832
848
|
}
|
|
833
849
|
})),
|
|
834
|
-
path: os.files.path.handler(({ input, context: { ctx } }) => run(() => {
|
|
850
|
+
path: os.files.path.handler(({ input, context: { ctx } }) => run(async () => {
|
|
835
851
|
requireFields(input, 'session_id', 'path');
|
|
836
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
852
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
837
853
|
try {
|
|
838
854
|
return { ok: true, path: safeResolve(s.workspace, input.path) };
|
|
839
855
|
}
|
|
@@ -843,7 +859,7 @@ export const sessionsRouter = os.router({
|
|
|
843
859
|
})),
|
|
844
860
|
openVsCode: os.files.openVsCode.handler(({ input, context: { ctx } }) => run(async () => {
|
|
845
861
|
requireFields(input, 'session_id', 'path');
|
|
846
|
-
const s = fileOpsSession(ctx, input.session_id);
|
|
862
|
+
const s = (await fileOpsSession(ctx, input.session_id));
|
|
847
863
|
try {
|
|
848
864
|
const target = safeResolve(s.workspace, input.path);
|
|
849
865
|
if (!existsSync(target))
|
|
@@ -859,7 +875,7 @@ export const sessionsRouter = os.router({
|
|
|
859
875
|
throw fileError(error);
|
|
860
876
|
}
|
|
861
877
|
})),
|
|
862
|
-
escapeAuthorize: os.files.escapeAuthorize.handler(({ input, context: { ctx } }) => run(() => {
|
|
878
|
+
escapeAuthorize: os.files.escapeAuthorize.handler(({ input, context: { ctx } }) => run(async () => {
|
|
863
879
|
// A Referer alone is not a browser fetch: Python required `Origin`, which the global CSRF check has already matched.
|
|
864
880
|
if (!ctx.header('origin'))
|
|
865
881
|
throw new HttpError(403, 'browser origin required');
|
|
@@ -871,7 +887,7 @@ export const sessionsRouter = os.router({
|
|
|
871
887
|
throw new HttpError(400, 'session_id is required');
|
|
872
888
|
if (!rel)
|
|
873
889
|
throw new HttpError(400, 'path is required');
|
|
874
|
-
const s = fileOpsSession(ctx, sid);
|
|
890
|
+
const s = (await fileOpsSession(ctx, sid));
|
|
875
891
|
try {
|
|
876
892
|
return ctx.deps.escapeGrants.authorize(s.workspace, sid, s.profile, rel);
|
|
877
893
|
}
|
|
@@ -879,8 +895,8 @@ export const sessionsRouter = os.router({
|
|
|
879
895
|
throw fileError(error, 404);
|
|
880
896
|
}
|
|
881
897
|
})),
|
|
882
|
-
escapeList: os.files.escapeList.handler(({ input, context: { ctx } }) => run(() => {
|
|
883
|
-
const req = escapeRequest(ctx, input.session_id, input.token, input.path ?? '.');
|
|
898
|
+
escapeList: os.files.escapeList.handler(({ input, context: { ctx } }) => run(async () => {
|
|
899
|
+
const req = (await escapeRequest(ctx, input.session_id, input.token, input.path ?? '.'));
|
|
884
900
|
try {
|
|
885
901
|
const listing = ctx.deps.escapeGrants.list(req);
|
|
886
902
|
return { ...listing, entries: serializeEntriesForBrowser(listing.entries) };
|
|
@@ -889,8 +905,8 @@ export const sessionsRouter = os.router({
|
|
|
889
905
|
throw fileError(error, 404);
|
|
890
906
|
}
|
|
891
907
|
})),
|
|
892
|
-
escapeRead: os.files.escapeRead.handler(({ input, context: { ctx } }) => run(() => {
|
|
893
|
-
const req = escapeRequest(ctx, input.session_id, input.token, input.path ?? '');
|
|
908
|
+
escapeRead: os.files.escapeRead.handler(({ input, context: { ctx } }) => run(async () => {
|
|
909
|
+
const req = (await escapeRequest(ctx, input.session_id, input.token, input.path ?? ''));
|
|
894
910
|
try {
|
|
895
911
|
const file = ctx.deps.escapeGrants.read(req);
|
|
896
912
|
// The frame loads the bytes through the same grant; the workspace preview grant would outlive and skip its re-checks.
|
|
@@ -903,12 +919,12 @@ export const sessionsRouter = os.router({
|
|
|
903
919
|
},
|
|
904
920
|
});
|
|
905
921
|
/** The escape routes' shared front half: required ids, the session, and the grant re-check (403 when it fails). */
|
|
906
|
-
export function escapeRequest(ctx, sid, token, rel) {
|
|
922
|
+
export async function escapeRequest(ctx, sid, token, rel) {
|
|
907
923
|
if (!sid)
|
|
908
924
|
throw new HttpError(400, 'session_id is required');
|
|
909
925
|
if (!token)
|
|
910
926
|
throw new HttpError(400, 'token is required');
|
|
911
|
-
const s = fileOpsSession(ctx, sid);
|
|
927
|
+
const s = (await fileOpsSession(ctx, sid));
|
|
912
928
|
try {
|
|
913
929
|
return ctx.deps.escapeGrants.resolve(s.workspace, sid, s.profile, token, rel);
|
|
914
930
|
}
|
|
@@ -947,18 +963,18 @@ export function fileError(error, notFoundStatus = 400) {
|
|
|
947
963
|
* `state.db` but that has no `sessions/<sid>.json` (CLI, messaging) is served as an external view bound to the active
|
|
948
964
|
* workspace, as the sidebar already lists it (issue #3280).
|
|
949
965
|
*/
|
|
950
|
-
export function fileOpsSession(ctx, sid, opts = {}) {
|
|
966
|
+
export async function fileOpsSession(ctx, sid, opts = {}) {
|
|
951
967
|
let session;
|
|
952
968
|
try {
|
|
953
|
-
session = ctx.deps.sessionStore.get(sid, { metadataOnly: true });
|
|
969
|
+
session = (await ctx.deps.sessionStore.get(sid, { metadataOnly: true }));
|
|
954
970
|
}
|
|
955
971
|
catch {
|
|
956
972
|
const profile = ctx.deps.activeProfile();
|
|
957
|
-
if (!isSafeSessionId(sid) || !stateDbHasSession
|
|
973
|
+
if (!isSafeSessionId(sid) || !(await stateDbSessionReadAsync(false, 'stateDbHasSession', ctx.deps.cliSessions.dbPath(profile), sid)))
|
|
958
974
|
throw new HttpError(404, 'Session not found');
|
|
959
975
|
if (!ctx.deps.workspaces.profileSupportsLocalIo(profile))
|
|
960
976
|
throw new HttpError(400, REMOTE_WORKSPACE_UNSUPPORTED_CODE, { message: REMOTE_WORKSPACE_UNSUPPORTED_MESSAGE });
|
|
961
|
-
return { workspace: ctx.deps.workspaces.lastWorkspace(profile), profile, recovered: false, session: null };
|
|
977
|
+
return { workspace: (await ctx.deps.workspaces.lastWorkspace(profile)), profile, recovered: false, session: null };
|
|
962
978
|
}
|
|
963
979
|
if (!ctx.deps.profilesMatch(session.profile, ctx.deps.activeProfile()))
|
|
964
980
|
throw new HttpError(404, 'Session not found');
|
|
@@ -968,7 +984,7 @@ export function fileOpsSession(ctx, sid, opts = {}) {
|
|
|
968
984
|
let recovered = false;
|
|
969
985
|
try {
|
|
970
986
|
;
|
|
971
|
-
[workspace, recovered] = ctx.deps.workspaces.resolveImplicitWithRecovery(session.workspace, (p) => ctx.deps.workspaces.lastWorkspace(p), session.profile);
|
|
987
|
+
[workspace, recovered] = (await ctx.deps.workspaces.resolveImplicitWithRecovery(session.workspace, async (p) => (await ctx.deps.workspaces.lastWorkspace(p)), session.profile));
|
|
972
988
|
}
|
|
973
989
|
catch (error) {
|
|
974
990
|
if (opts.strictWorkspace)
|
|
@@ -981,10 +997,10 @@ export function fileOpsSession(ctx, sid, opts = {}) {
|
|
|
981
997
|
if (cached)
|
|
982
998
|
cached.workspace = workspace;
|
|
983
999
|
try {
|
|
984
|
-
const full = ctx.deps.sessionStore.load(sid);
|
|
1000
|
+
const full = (await ctx.deps.sessionStore.load(sid));
|
|
985
1001
|
if (full) {
|
|
986
1002
|
full.workspace = workspace;
|
|
987
|
-
ctx.deps.sessionStore.save(full, { touchUpdatedAt: false });
|
|
1003
|
+
(await ctx.deps.sessionStore.save(full, { touchUpdatedAt: false }));
|
|
988
1004
|
}
|
|
989
1005
|
}
|
|
990
1006
|
catch { /* recovery persistence is best effort */ }
|