@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
package/dist/api/chat-router.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** Chat turn admission, control, approvals, clarify, goals, background tasks, and side questions. */
|
|
2
|
+
import { timingOutcome } from '../startup-timing.js';
|
|
2
3
|
import { GATEWAY_APPROVAL_RELAY_UNAVAILABLE, isGenericContinuationIntent } from '../sessions/turn.js';
|
|
3
4
|
import { implement } from '@orpc/server';
|
|
4
|
-
import { chatContract, MAX_CHAT_ATTACHMENTS } from '@maudecode/talaria-web-contracts';
|
|
5
|
+
import { chatContract, MAX_CHAT_ATTACHMENTS, RPC_ERROR_CODES } from '@maudecode/talaria-web-contracts';
|
|
5
6
|
import { randomUUID } from 'node:crypto';
|
|
6
7
|
import { HttpError } from './router.js';
|
|
7
8
|
import { requestSessionIdGuard, streamOwnerSessionId, streamVisibleToRequest } from './session-visibility.js';
|
|
@@ -10,6 +11,9 @@ import { SessionNotFound } from '../sessions/store.js';
|
|
|
10
11
|
import { compressionRecoveryPayload, isSafeSessionId } from '../sessions/session.js';
|
|
11
12
|
import { messageText } from '../sessions/merge.js';
|
|
12
13
|
import { str } from '../util.js';
|
|
14
|
+
import { activeProfileName } from '../auth/gate.js';
|
|
15
|
+
import { SidecarError } from '../sidecar/client.js';
|
|
16
|
+
import { unsupportedPromptMessage } from '../tools/commands.js';
|
|
13
17
|
const os = implement(chatContract).$context().use(requestSessionIdGuard);
|
|
14
18
|
const STEER_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
|
|
15
19
|
const PROFILE_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
|
|
@@ -27,14 +31,14 @@ async function run(fn) {
|
|
|
27
31
|
}
|
|
28
32
|
}
|
|
29
33
|
/** A session this request's profile may see (TAL-372 background work never crosses owners). */
|
|
30
|
-
function visibleSession(ctx, sid) {
|
|
31
|
-
if (!ctx.deps.sessions.sessionIdVisible(sid))
|
|
34
|
+
async function visibleSession(ctx, sid) {
|
|
35
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
|
|
32
36
|
throw new HttpError(404, 'Session not found');
|
|
33
|
-
return getSession(ctx, sid, true);
|
|
37
|
+
return (await getSession(ctx, sid, true));
|
|
34
38
|
}
|
|
35
|
-
function getSession(ctx, sid, metadataOnly = false) {
|
|
39
|
+
async function getSession(ctx, sid, metadataOnly = false) {
|
|
36
40
|
try {
|
|
37
|
-
return ctx.deps.sessionStore.get(sid, { metadataOnly });
|
|
41
|
+
return (await ctx.deps.sessionStore.get(sid, { metadataOnly }));
|
|
38
42
|
}
|
|
39
43
|
catch {
|
|
40
44
|
throw new HttpError(404, 'Session not found');
|
|
@@ -88,9 +92,61 @@ function visibleOrRetag(ctx, s, requestedProfile) {
|
|
|
88
92
|
}
|
|
89
93
|
throw new HttpError(404, 'Session not found');
|
|
90
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* TAL-817: what the model gets for a typed Agent prompt built-in (`/plan`, `/initiate-setup`, …): the Agent's own expansion
|
|
97
|
+
* of it for this session's profile, workspace and toolsets, while the transcript keeps the typed text; null when `msg` is
|
|
98
|
+
* not one. One the Agent cannot expand is
|
|
99
|
+
* refused with the catalog's message instead of reaching the model raw. Without a sidecar the turn reports that itself.
|
|
100
|
+
*/
|
|
101
|
+
async function expandPromptBuiltin(ctx, s, msg, workspace) {
|
|
102
|
+
const sidecar = ctx.deps.sidecar();
|
|
103
|
+
if (!msg.startsWith('/') || !sidecar)
|
|
104
|
+
return null;
|
|
105
|
+
// Only `/init` reads the workspace, and the sidecar refuses it without one; the turn reports a bad workspace itself.
|
|
106
|
+
let cwd = '';
|
|
107
|
+
try {
|
|
108
|
+
cwd = (await ctx.deps.sessions.turnWorkspace(s, workspace));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
cwd = '';
|
|
112
|
+
}
|
|
113
|
+
let expanded;
|
|
114
|
+
try {
|
|
115
|
+
expanded = await sidecar.call('commands.expand_prompt', {
|
|
116
|
+
profile_home: ctx.deps.profileHome(s.profile ?? activeProfileName(ctx)), command: msg, session_id: s.session_id, workspace: cwd,
|
|
117
|
+
enabled_toolsets: s.enabled_toolsets,
|
|
118
|
+
}, { timeoutMs: 120_000 });
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (!(error instanceof SidecarError))
|
|
122
|
+
throw error;
|
|
123
|
+
const invalid = error.condition === 'invalid_params' || error.code === RPC_ERROR_CODES.invalidParams;
|
|
124
|
+
throw new HttpError(invalid ? 400 : error.condition === 'sidecar_unavailable' ? 503 : 502, error.message);
|
|
125
|
+
}
|
|
126
|
+
if (expanded.name !== null && expanded.message === null)
|
|
127
|
+
throw new HttpError(400, unsupportedPromptMessage(expanded.name));
|
|
128
|
+
return expanded.message;
|
|
129
|
+
}
|
|
91
130
|
/** `chat.start`; a `chat.steer` sent while a background turn runs starts the user's turn through it too (TAL-460). */
|
|
92
131
|
async function startChat(ctx, body, settle = {}) {
|
|
132
|
+
ctx.enterChatStart();
|
|
133
|
+
const timing = ctx.startupTiming;
|
|
134
|
+
try {
|
|
135
|
+
const response = await startChatTimed(ctx, body, settle);
|
|
136
|
+
if (!response.stream_id)
|
|
137
|
+
timing?.finish('noop');
|
|
138
|
+
return response;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
timing?.finish(timingOutcome(error));
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function startChatTimed(ctx, body, settle) {
|
|
146
|
+
const timing = ctx.startupTiming;
|
|
147
|
+
const measure = (name, fn) => timing ? timing.measure(name, fn) : Promise.resolve(fn());
|
|
93
148
|
requireField(body, 'session_id');
|
|
149
|
+
timing?.identify(str(body.session_id));
|
|
94
150
|
if (str(body.message).trim() === '[SILENT]')
|
|
95
151
|
return { status: 'suppressed', reason: 'silent_control_message' };
|
|
96
152
|
if (body.regenerate === true)
|
|
@@ -98,51 +154,66 @@ async function startChat(ctx, body, settle = {}) {
|
|
|
98
154
|
const sid = str(body.session_id);
|
|
99
155
|
// Python `_agent_runtime_barrier_response`: a stale local Agent checkout is refused with a typed 409 before any
|
|
100
156
|
// session state is materialised, claimed, or mutated.
|
|
101
|
-
await ensureAgentRuntimeCurrent(ctx.deps.sidecar());
|
|
102
|
-
|
|
103
|
-
await
|
|
157
|
+
await measure('runtime_barrier', () => ensureAgentRuntimeCurrent(ctx.deps.sidecar()));
|
|
158
|
+
const owner = ctx.deps.sessions.owner;
|
|
159
|
+
if (owner && (await measure('owner_routing', () => owner.isOwned(sid)))) {
|
|
160
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
|
|
161
|
+
throw new HttpError(404, 'Session not found');
|
|
162
|
+
const response = (await owner.submit(sid, body, timing));
|
|
163
|
+
timing?.finish('ok');
|
|
164
|
+
return response;
|
|
165
|
+
}
|
|
166
|
+
// Admission reads the cached catalog snapshot; it never waits for a refresh.
|
|
167
|
+
timing?.begin('catalog_wait');
|
|
168
|
+
timing?.end('catalog_wait', 'noop');
|
|
169
|
+
const closeLoad = timing?.begin('session_load');
|
|
104
170
|
let s;
|
|
105
171
|
try {
|
|
106
|
-
s = ctx.deps.sessionStore.get(sid);
|
|
172
|
+
s = (await ctx.deps.sessionStore.get(sid));
|
|
107
173
|
}
|
|
108
174
|
catch {
|
|
109
175
|
// Python `_claim_or_synthesize_cli_session` on the POST path: a claimable foreign (CLI/TUI/Desktop) session is
|
|
110
176
|
// materialised as a WebUI sidecar before its first turn; an owned foreign store answers 403, nothing → 404.
|
|
111
|
-
const synth = ctx.deps.sessions.claimOrSynthesizeCliSession(sid);
|
|
177
|
+
const synth = (await ctx.deps.sessions.claimOrSynthesizeCliSession(sid));
|
|
112
178
|
if (!synth.session)
|
|
113
179
|
throw new HttpError(404, 'Session not found');
|
|
114
180
|
if (synth.reason === 'not_claimable')
|
|
115
181
|
throw new HttpError(403, 'session is read-only in its foreign store; cannot be claimed writeable in WebUI');
|
|
116
|
-
ctx.deps.sessionStore.save(synth.session);
|
|
117
|
-
s = ctx.deps.sessionStore.get(sid);
|
|
182
|
+
await ctx.deps.sessionStore.save(synth.session);
|
|
183
|
+
s = (await ctx.deps.sessionStore.get(sid));
|
|
118
184
|
}
|
|
185
|
+
closeLoad?.();
|
|
186
|
+
const closeOwnership = timing?.begin('ownership_checks');
|
|
119
187
|
// Python `_get_or_materialize_session` raised PermissionError for both: a read-only import and a delegated
|
|
120
188
|
// subagent child (by sidecar tag or state.db row), which chat start answered with the same 403.
|
|
121
|
-
if (ctx.deps.sessions.isReadOnly(s) || s.branchSourceReadonly || ctx.deps.sessions.isSubagentViewOnly(sid))
|
|
189
|
+
if ((await ctx.deps.sessions.isReadOnly(s)) || s.branchSourceReadonly || (await ctx.deps.sessions.isSubagentViewOnly(sid)))
|
|
122
190
|
throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
|
|
123
191
|
const requestedProfile = str(body.profile).trim();
|
|
124
192
|
if (requestedProfile && requestedProfile !== 'default' && !PROFILE_ID_RE.test(requestedProfile))
|
|
125
193
|
throw new HttpError(400, 'invalid profile');
|
|
126
194
|
visibleOrRetag(ctx, s, requestedProfile);
|
|
195
|
+
closeOwnership?.();
|
|
127
196
|
const msg = str(body.message).trim();
|
|
128
197
|
const attachments = normalizeChatAttachments(body.attachments).slice(0, MAX_CHAT_ATTACHMENTS);
|
|
129
198
|
// TAL-276: an attached file alone makes a turn; one with neither text nor a file path is refused.
|
|
130
199
|
if (!msg && !attachments.some((att) => str(att.path)))
|
|
131
200
|
throw new HttpError(400, 'message is required');
|
|
201
|
+
const prompt = await measure('prompt_preparation', () => expandPromptBuiltin(ctx, s, msg, body.workspace));
|
|
132
202
|
// TAL-460: the user's message never joins a background turn; that turn stops quietly and this one takes its place.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
s = ctx.deps.sessionStore.get(sid);
|
|
203
|
+
const yielded = await measure('background_yield', () => ctx.deps.turns.yieldBackgroundTurn(sid));
|
|
204
|
+
if (prompt !== null || yielded) {
|
|
205
|
+
s = (await ctx.deps.sessionStore.get(sid));
|
|
206
|
+
visibleOrRetag(ctx, s, requestedProfile);
|
|
136
207
|
}
|
|
137
208
|
// Python `compression_recovery_payload_for_session` + `is_generic_continuation_intent`.
|
|
138
209
|
if (compressionRecoveryPayload(s) && !attachments.length && isGenericContinuationIntent(msg)) {
|
|
139
210
|
throw new HttpError(409, 'This session exhausted context compression. Start a focused continuation, then describe the next narrow task.', { type: 'compression_recovery_required', compression_recovery: s.compression_recovery, session_id: s.session_id });
|
|
140
211
|
}
|
|
141
|
-
const workspace = ctx.deps.sessions.turnWorkspace(s, body.workspace);
|
|
212
|
+
const workspace = await measure('workspace_preparation', () => ctx.deps.sessions.turnWorkspace(s, body.workspace));
|
|
142
213
|
const [model, provider, normalized] = ctx.deps.sessions.turnModel(s, body);
|
|
143
214
|
if (body.moa_config)
|
|
144
215
|
throw new HttpError(503, 'MoA overrides need the Agent command registry (checkpoint 7).');
|
|
145
|
-
const response = ctx.deps.turns.start(s, { msg, attachments, workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', ...settle });
|
|
216
|
+
const response = (await ctx.deps.turns.start(s, { timing, msg, ...(prompt === null ? {} : { prompt }), attachments, workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', voiceTurn: body.voice_turn === true, connectCard: body.connect_card === true, skillSecret: body.skill_secret === true, ...settle }));
|
|
146
217
|
if (response._status !== undefined && response._status >= 400)
|
|
147
218
|
throw new HttpError(response._status, response.error ?? 'chat start failed', response.active_stream_id ? { active_stream_id: response.active_stream_id } : {});
|
|
148
219
|
return startPayload(response);
|
|
@@ -152,7 +223,9 @@ async function startChat(ctx, body, settle = {}) {
|
|
|
152
223
|
* failed after streaming text, answers `partial` with that text; any other failure answers with its error frame.
|
|
153
224
|
*/
|
|
154
225
|
async function syncChat(ctx, body) {
|
|
155
|
-
if (ctx.deps.sessions.
|
|
226
|
+
if (await ctx.deps.sessions.owner?.isOwned(str(body.session_id)))
|
|
227
|
+
throw new HttpError(409, 'This owner requires the asynchronous chat stream', { code: 'owner_requires_streaming' });
|
|
228
|
+
if ((await ctx.deps.sessions.isSubagentViewOnly(str(body.session_id))))
|
|
156
229
|
throw new HttpError(400, 'Subagent sessions are view-only and cannot be written from WebUI');
|
|
157
230
|
if (!str(body.message).trim())
|
|
158
231
|
throw new HttpError(400, 'empty message');
|
|
@@ -164,8 +237,8 @@ async function syncChat(ctx, body) {
|
|
|
164
237
|
const streamId = str(started.stream_id);
|
|
165
238
|
if (streamId)
|
|
166
239
|
await ctx.deps.turns.finished(streamId);
|
|
167
|
-
const s = getSession(ctx, str(body.session_id));
|
|
168
|
-
const session = ctx.deps.turns.publicTerminalSession(s);
|
|
240
|
+
const s = (await getSession(ctx, str(body.session_id)));
|
|
241
|
+
const session = (await ctx.deps.turns.publicTerminalSession(s));
|
|
169
242
|
const ended = outcome;
|
|
170
243
|
// A `[SILENT]` control message starts no turn.
|
|
171
244
|
if (!streamId || (ended && 'answer' in ended)) {
|
|
@@ -186,8 +259,24 @@ async function syncChat(ctx, body) {
|
|
|
186
259
|
}
|
|
187
260
|
export const chatRouter = os.router({
|
|
188
261
|
chat: {
|
|
189
|
-
|
|
190
|
-
|
|
262
|
+
ownerAction: os.chat.ownerAction.handler(({ input, context: { ctx } }) => run(async () => {
|
|
263
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(input.session_id)))
|
|
264
|
+
throw new HttpError(404, 'Session not found');
|
|
265
|
+
const owner = ctx.deps.sessions.owner;
|
|
266
|
+
if (!owner)
|
|
267
|
+
throw new HttpError(503, 'Native session controls are unavailable');
|
|
268
|
+
let draft;
|
|
269
|
+
if (input.action === 'retry') {
|
|
270
|
+
draft = await owner.retry(input.session_id, input.admission_id, input.execution_generation);
|
|
271
|
+
}
|
|
272
|
+
else
|
|
273
|
+
await owner.action(input.session_id, input);
|
|
274
|
+
const session = await ctx.deps.sessions.detail(input.session_id, {});
|
|
275
|
+
const model_change = session.owner_attachment?.model_change;
|
|
276
|
+
return { ok: true, session: session, ...(draft === undefined ? {} : { draft }), ...(model_change ? { model_change } : {}) };
|
|
277
|
+
})),
|
|
278
|
+
sync: os.chat.sync.handler(({ input, context: { ctx } }) => run(async () => (await syncChat(ctx, input)))),
|
|
279
|
+
start: os.chat.start.handler(({ input, context: { ctx } }) => run(async () => (await startChat(ctx, input)))),
|
|
191
280
|
steer: os.chat.steer.handler(({ input, context: { ctx } }) => run(async () => {
|
|
192
281
|
const sid = str(input.session_id).trim();
|
|
193
282
|
const text = str(input.text).trim();
|
|
@@ -201,43 +290,52 @@ export const chatRouter = os.router({
|
|
|
201
290
|
throw new HttpError(400, 'steer_id must be 1-128 URL-safe characters');
|
|
202
291
|
if (!steerId)
|
|
203
292
|
steerId = `steer-${randomUUID()}`;
|
|
204
|
-
if (!ctx.deps.sessions.sessionIdVisible(sid))
|
|
293
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(sid)))
|
|
205
294
|
throw new HttpError(404, 'Session not found');
|
|
206
295
|
const active = ctx.deps.registry.activeRunStreamForSession(sid);
|
|
207
296
|
if (active && ctx.deps.registry.activeRuns.get(active)?.origin === 'background') {
|
|
208
297
|
const started = await startChat(ctx, { session_id: sid, message: text });
|
|
209
298
|
return { accepted: true, fallback: null, stream_id: started.stream_id ? str(started.stream_id) : null, steer_id: steerId, started_turn: started };
|
|
210
299
|
}
|
|
211
|
-
|
|
300
|
+
// TAL-817: a prompt built-in steers with its expansion; the steer still shows as typed. A missing session is the steer's to report.
|
|
301
|
+
let target = null;
|
|
302
|
+
try {
|
|
303
|
+
target = (await ctx.deps.sessionStore.get(sid, { metadataOnly: true }));
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
target = null;
|
|
307
|
+
}
|
|
308
|
+
const prompt = target ? await expandPromptBuiltin(ctx, target, text, undefined) : null;
|
|
309
|
+
return (await ctx.deps.turns.steer(sid, prompt ?? text, display || (prompt === null ? '' : text), steerId));
|
|
212
310
|
})),
|
|
213
311
|
// TAL-424: Edit, Cancel and Send now on a pending steer; unknown or already-taken steers answer false.
|
|
214
312
|
steerWithdraw: os.chat.steerWithdraw.handler(({ input, context: { ctx } }) => run(async () => {
|
|
215
|
-
if (!ctx.deps.sessions.sessionIdVisible(input.session_id))
|
|
313
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(input.session_id)))
|
|
216
314
|
throw new HttpError(404, 'Session not found');
|
|
217
|
-
return ctx.deps.turns.withdrawSteer(input.session_id, input.steer_id, input.reason);
|
|
315
|
+
return (await ctx.deps.turns.withdrawSteer(input.session_id, input.steer_id, input.reason));
|
|
218
316
|
})),
|
|
219
317
|
steerSendNow: os.chat.steerSendNow.handler(({ input, context: { ctx } }) => run(async () => {
|
|
220
|
-
if (!ctx.deps.sessions.sessionIdVisible(input.session_id))
|
|
318
|
+
if (!(await ctx.deps.sessions.sessionIdVisible(input.session_id)))
|
|
221
319
|
throw new HttpError(404, 'Session not found');
|
|
222
|
-
return ctx.deps.turns.sendSteerNow(input.session_id, input.steer_id);
|
|
320
|
+
return (await ctx.deps.turns.sendSteerNow(input.session_id, input.steer_id));
|
|
223
321
|
})),
|
|
224
322
|
cancel: os.chat.cancel.handler(({ input, context: { ctx } }) => run(async () => {
|
|
225
323
|
const streamId = str(input.stream_id);
|
|
226
324
|
if (!streamId)
|
|
227
325
|
throw new HttpError(400, 'stream_id required');
|
|
228
|
-
if (!streamVisibleToRequest(ctx, streamId))
|
|
326
|
+
if (!(await streamVisibleToRequest(ctx, streamId)))
|
|
229
327
|
throw new HttpError(404, 'Session not found');
|
|
230
328
|
const { cancelled, withdrawn } = await ctx.deps.turns.cancel(streamId);
|
|
231
329
|
return { ok: true, cancelled, stream_id: streamId, withdrawn_steers: withdrawn };
|
|
232
330
|
})),
|
|
233
|
-
streamStatus: os.chat.streamStatus.handler(({ input, context: { ctx } }) => run(() => {
|
|
331
|
+
streamStatus: os.chat.streamStatus.handler(({ input, context: { ctx } }) => run(async () => {
|
|
234
332
|
const streamId = str(input.stream_id);
|
|
235
|
-
if (!streamVisibleToRequest(ctx, streamId))
|
|
333
|
+
if (!(await streamVisibleToRequest(ctx, streamId)))
|
|
236
334
|
throw new HttpError(404, 'Session not found');
|
|
237
335
|
const active = ctx.deps.registry.liveIds.has(streamId);
|
|
238
|
-
const owner = streamOwnerSessionId(ctx, streamId);
|
|
239
|
-
const payload = { active, stream_id: streamId, replay_available: false, blocking_stream_id: owner ? ctx.deps.sessions.activeRunBlocking(owner) : null };
|
|
240
|
-
const summary = streamId ? ctx.deps.journal.findRunSummary(streamId) : null;
|
|
336
|
+
const owner = (await streamOwnerSessionId(ctx, streamId));
|
|
337
|
+
const payload = { active, stream_id: streamId, replay_available: false, blocking_stream_id: owner ? (await ctx.deps.sessions.activeRunBlocking(owner)) : null };
|
|
338
|
+
const summary = streamId ? (await ctx.deps.journal.findRunSummary(streamId)) : null;
|
|
241
339
|
if (summary) {
|
|
242
340
|
payload.replay_available = true;
|
|
243
341
|
const terminal = summary.terminal;
|
|
@@ -247,7 +345,7 @@ export const chatRouter = os.router({
|
|
|
247
345
|
})),
|
|
248
346
|
},
|
|
249
347
|
approval: {
|
|
250
|
-
pending: os.approval.pending.handler(({ input, context: { ctx } }) => run(() => ctx.deps.pending.approvalPending(str(input.session_id)))),
|
|
348
|
+
pending: os.approval.pending.handler(({ input, context: { ctx } }) => run(async () => (await ctx.deps.sessions.owner?.isOwned(str(input.session_id))) ? ctx.deps.sessions.owner.pending(str(input.session_id), 'approval') : ctx.deps.pending.approvalPending(str(input.session_id)))),
|
|
251
349
|
respond: os.approval.respond.handler(({ input, context: { ctx } }) => run(async () => {
|
|
252
350
|
const sid = str(input.session_id);
|
|
253
351
|
if (!sid)
|
|
@@ -268,14 +366,15 @@ export const chatRouter = os.router({
|
|
|
268
366
|
})),
|
|
269
367
|
},
|
|
270
368
|
clarify: {
|
|
271
|
-
pending: os.clarify.pending.handler(({ input, context: { ctx } }) => run(() => ctx.deps.pending.clarifyPending(str(input.session_id)))),
|
|
369
|
+
pending: os.clarify.pending.handler(({ input, context: { ctx } }) => run(async () => (await ctx.deps.sessions.owner?.isOwned(str(input.session_id))) ? ctx.deps.sessions.owner.pending(str(input.session_id), 'clarify') : ctx.deps.pending.clarifyPending(str(input.session_id)))),
|
|
272
370
|
respond: os.clarify.respond.handler(({ input, context: { ctx } }) => run(async () => {
|
|
273
371
|
const sid = str(input.session_id);
|
|
274
372
|
if (!sid)
|
|
275
373
|
throw new HttpError(400, 'session_id is required');
|
|
276
|
-
//
|
|
277
|
-
|
|
278
|
-
|
|
374
|
+
// Both keyed answers and older clients' raw replies are shaped against the pending prompt; only a vault prompt
|
|
375
|
+
// takes a decline (TAL-887).
|
|
376
|
+
const reply = input.decline === true ? null : input.answers ?? str(input.response ?? input.answer ?? input.choice).trim();
|
|
377
|
+
if (reply === '')
|
|
279
378
|
throw new HttpError(400, 'response is required');
|
|
280
379
|
const result = await ctx.deps.turns.respondClarify(sid, str(input.clarify_id), reply);
|
|
281
380
|
if (result.stale)
|
|
@@ -284,7 +383,8 @@ export const chatRouter = os.router({
|
|
|
284
383
|
throw new HttpError(400, 'answers must answer every question of the pending clarification', { ok: false });
|
|
285
384
|
if (!result.ok)
|
|
286
385
|
throw new HttpError(503, result.error ?? 'clarify relay failed', { ok: false });
|
|
287
|
-
|
|
386
|
+
// A vault answer is never echoed back.
|
|
387
|
+
return result.response === undefined ? { ok: true } : { ok: true, response: result.response };
|
|
288
388
|
})),
|
|
289
389
|
},
|
|
290
390
|
goal: os.goal.handler(({ input, context: { ctx } }) => run(async () => {
|
|
@@ -295,10 +395,10 @@ export const chatRouter = os.router({
|
|
|
295
395
|
return { status: 'suppressed', reason: 'silent_control_message' };
|
|
296
396
|
const sid = str(body.session_id);
|
|
297
397
|
// Python: a delegated subagent child is view-only; its goal state is never mutated and no turn starts on it.
|
|
298
|
-
if (ctx.deps.sessions.isSubagentViewOnly(sid))
|
|
398
|
+
if ((await ctx.deps.sessions.isSubagentViewOnly(sid)))
|
|
299
399
|
throw new HttpError(400, 'Subagent sessions are view-only and cannot run /goal from WebUI');
|
|
300
|
-
const s = getSession(ctx, sid);
|
|
301
|
-
if (ctx.deps.sessions.isReadOnly(s) || s.branchSourceReadonly)
|
|
400
|
+
const s = (await getSession(ctx, sid));
|
|
401
|
+
if ((await ctx.deps.sessions.isReadOnly(s)) || s.branchSourceReadonly)
|
|
302
402
|
throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
|
|
303
403
|
const requestedProfile = str(body.profile).trim();
|
|
304
404
|
if (requestedProfile && requestedProfile !== 'default' && !PROFILE_ID_RE.test(requestedProfile))
|
|
@@ -309,7 +409,7 @@ export const chatRouter = os.router({
|
|
|
309
409
|
if (s.active_stream_id) {
|
|
310
410
|
streamRunning = ctx.deps.registry.liveIds.has(s.active_stream_id);
|
|
311
411
|
if (!streamRunning)
|
|
312
|
-
ctx.deps.sessions.clearStaleStreamState(s);
|
|
412
|
+
(await ctx.deps.sessions.clearStaleStreamState(s));
|
|
313
413
|
}
|
|
314
414
|
const sidecar = ctx.deps.sidecar();
|
|
315
415
|
if (!sidecar)
|
|
@@ -329,21 +429,27 @@ export const chatRouter = os.router({
|
|
|
329
429
|
defaultMaxTurns = 20;
|
|
330
430
|
}
|
|
331
431
|
const snapshot = await sidecar.call('goals.snapshot', { session_id: sid, profile_home: profileHome, default_max_turns: defaultMaxTurns });
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
432
|
+
await ctx.deps.sessions.assertWritable(s);
|
|
433
|
+
const payload = await sidecar.call('goals.command', { session_id: sid, profile_home: profileHome, args, stream_running: streamRunning, default_max_turns: defaultMaxTurns, workspace: str(s.workspace) || undefined });
|
|
434
|
+
// TAL-808: the session `goal` follows the command before the client reloads the session.
|
|
435
|
+
await ctx.deps.turns.refreshGoal(s);
|
|
436
|
+
if (payload.ok === false) {
|
|
437
|
+
// Clients show the body's `error`, so the Agent's reason replaces the sidecar's code there.
|
|
438
|
+
const reason = str(payload.message || payload.error || 'goal command failed');
|
|
439
|
+
throw new HttpError(payload.error === 'agent_running' ? 409 : 400, reason, { ...payload, error: reason });
|
|
440
|
+
}
|
|
335
441
|
const kickoff = str(payload.kickoff_prompt).trim();
|
|
336
442
|
if (kickoff) {
|
|
337
|
-
|
|
338
|
-
await ctx.deps.sessions.deps.warmSessionModelRepair?.(s.profile);
|
|
339
|
-
const workspace = ctx.deps.sessions.turnWorkspace(s, body.workspace);
|
|
443
|
+
const workspace = (await ctx.deps.sessions.turnWorkspace(s, body.workspace));
|
|
340
444
|
const [model, provider, normalized] = ctx.deps.sessions.turnModel(s, body);
|
|
341
|
-
const started = ctx.deps.turns.start(s, { msg: kickoff, attachments: [], workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', goalRelated: true });
|
|
445
|
+
const started = (await ctx.deps.turns.start(s, { msg: kickoff, attachments: [], workspace, model, modelProvider: provider, normalizedModel: normalized, source: 'webui', goalRelated: true }));
|
|
342
446
|
if (started._status !== undefined && started._status >= 400) {
|
|
343
447
|
try {
|
|
448
|
+
await ctx.deps.sessions.assertWritable(s);
|
|
344
449
|
await sidecar.call('goals.restore', { session_id: sid, profile_home: profileHome, snapshot: snapshot.snapshot });
|
|
345
450
|
}
|
|
346
451
|
catch { /* best effort */ }
|
|
452
|
+
await ctx.deps.turns.refreshGoal(s);
|
|
347
453
|
throw new HttpError(started._status, started.error ?? 'goal kickoff failed', { ...payload, ok: false });
|
|
348
454
|
}
|
|
349
455
|
Object.assign(payload, startPayload(started));
|
|
@@ -355,69 +461,79 @@ export const chatRouter = os.router({
|
|
|
355
461
|
const body = input;
|
|
356
462
|
requireField(body, 'session_id', 'prompt');
|
|
357
463
|
// A subagent child's profile/workspace/context must never seed a runnable background session.
|
|
358
|
-
if (ctx.deps.sessions.isSubagentViewOnly(str(body.session_id)))
|
|
464
|
+
if ((await ctx.deps.sessions.isSubagentViewOnly(str(body.session_id))))
|
|
359
465
|
throw new HttpError(400, 'Subagent sessions are view-only and cannot run background tasks from WebUI');
|
|
360
|
-
|
|
361
|
-
await ctx.deps.sessions.
|
|
362
|
-
const parent = getSession(ctx, str(body.session_id));
|
|
363
|
-
if (ctx.deps.sessions.isReadOnly(parent) || parent.branchSourceReadonly)
|
|
466
|
+
const parent = (await getSession(ctx, str(body.session_id)));
|
|
467
|
+
if ((await ctx.deps.sessions.isReadOnly(parent)) || parent.branchSourceReadonly)
|
|
364
468
|
throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
|
|
365
469
|
const prompt = str(body.prompt).trim();
|
|
366
470
|
if (!prompt)
|
|
367
471
|
throw new HttpError(400, 'prompt is required');
|
|
368
472
|
const [model, modelProvider] = ctx.deps.sessions.turnModel(parent, {});
|
|
369
|
-
const bg = ctx.deps.sessionStore.newSession({ workspace: parent.workspace, model, modelProvider, profile: parent.profile });
|
|
473
|
+
const bg = (await ctx.deps.sessionStore.newSession({ workspace: parent.workspace, model, modelProvider, profile: parent.profile }));
|
|
370
474
|
bg.title = `bg: ${prompt.slice(0, 60)}`;
|
|
371
|
-
ctx.deps.sessionStore.save(bg);
|
|
475
|
+
await ctx.deps.sessionStore.save(bg);
|
|
372
476
|
// Python: `uuid.uuid4().hex[:8]`; a failed run still completes the task so `/api/background/tasks` reports it,
|
|
373
477
|
// and the hidden bg session file is removed afterwards.
|
|
374
478
|
const taskId = randomUUID().replace(/-/g, '').slice(0, 8);
|
|
375
479
|
// TAL-372: the parent session keeps the task's record and result, so every client and a restart see it.
|
|
376
|
-
ctx.deps.background.trackCommand(parent.session_id, taskId, prompt);
|
|
377
|
-
const cleanup = () => { try {
|
|
378
|
-
ctx.deps.sessionStore.
|
|
480
|
+
await ctx.deps.background.trackCommand(parent.session_id, taskId, prompt);
|
|
481
|
+
const cleanup = async () => { try {
|
|
482
|
+
(await ctx.deps.sessionStore.delete(bg.session_id, { tombstone: false }));
|
|
379
483
|
}
|
|
380
484
|
catch { /* best effort */ } };
|
|
381
|
-
const started = ctx.deps.turns.start(bg, {
|
|
485
|
+
const started = (await ctx.deps.turns.start(bg, {
|
|
382
486
|
msg: prompt, attachments: [], workspace: parent.workspace, model, modelProvider, source: 'webui',
|
|
383
487
|
// Python: the last non-error assistant reply with content, else "(no answer produced)".
|
|
384
|
-
onDone: (answer) => { ctx.deps.background.settleCommand(parent.session_id, taskId, 'completed', answer || '(no answer produced)'); cleanup(); },
|
|
385
|
-
onFailed: () => { ctx.deps.background.settleCommand(parent.session_id, taskId, 'failed', '(background task failed)'); cleanup(); },
|
|
386
|
-
});
|
|
488
|
+
onDone: async (answer) => { (await ctx.deps.background.settleCommand(parent.session_id, taskId, 'completed', answer || '(no answer produced)')); (await cleanup()); },
|
|
489
|
+
onFailed: async () => { (await ctx.deps.background.settleCommand(parent.session_id, taskId, 'failed', '(background task failed)')); (await cleanup()); },
|
|
490
|
+
}));
|
|
387
491
|
if (started._status !== undefined && started._status >= 400) {
|
|
388
492
|
// Admission refused (profile deleting, session busy…): nothing runs, so the tracked task and hidden
|
|
389
493
|
// session must not linger as "running".
|
|
390
|
-
ctx.deps.background.forgetCommand(parent.session_id, taskId);
|
|
391
|
-
cleanup();
|
|
494
|
+
await ctx.deps.background.forgetCommand(parent.session_id, taskId);
|
|
495
|
+
await cleanup();
|
|
392
496
|
throw new HttpError(started._status, started.error ?? 'background start failed');
|
|
393
497
|
}
|
|
394
|
-
ctx.deps.background.setCommandStream(parent.session_id, taskId, str(started.stream_id));
|
|
498
|
+
await ctx.deps.background.setCommandStream(parent.session_id, taskId, str(started.stream_id));
|
|
395
499
|
return { ok: true, task_id: taskId, stream_id: str(started.stream_id), session_id: bg.session_id };
|
|
396
500
|
})),
|
|
397
501
|
tasks: os.background.tasks.handler(({ input, context: { ctx } }) => run(async () => {
|
|
398
|
-
const s = visibleSession(ctx, input.session_id);
|
|
399
|
-
const snapshot = await ctx.deps.background.snapshot(s.session_id, s.profile);
|
|
502
|
+
const s = (await visibleSession(ctx, input.session_id));
|
|
503
|
+
const snapshot = await ctx.deps.background.snapshot(s.session_id, s.profile, { canStop: !(await ctx.deps.sessions.isReadOnly(s)) });
|
|
400
504
|
return { session_id: s.session_id, ...snapshot, tasks: input.kind ? snapshot.tasks.filter((t) => t.kind === input.kind) : snapshot.tasks };
|
|
401
505
|
})),
|
|
402
506
|
result: os.background.result.handler(({ input, context: { ctx } }) => run(async () => {
|
|
403
|
-
const s = visibleSession(ctx, input.session_id);
|
|
507
|
+
const s = (await visibleSession(ctx, input.session_id));
|
|
404
508
|
const text = await ctx.deps.background.result(s.session_id, s.profile, input.task_id);
|
|
405
509
|
if (text === null)
|
|
406
510
|
throw new HttpError(404, 'No result for this background task');
|
|
407
511
|
return { task_id: input.task_id, text };
|
|
408
512
|
})),
|
|
409
|
-
|
|
410
|
-
const s = visibleSession(ctx, input.session_id);
|
|
411
|
-
|
|
513
|
+
stop: os.background.stop.handler(({ input, context: { ctx } }) => run(async () => {
|
|
514
|
+
const s = await visibleSession(ctx, input.session_id);
|
|
515
|
+
await ctx.deps.sessions.assertWritable(s);
|
|
516
|
+
try {
|
|
517
|
+
return await ctx.deps.background.stop(s.session_id, s.profile, input.task_id);
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
if (!(error instanceof SidecarError))
|
|
521
|
+
throw error;
|
|
522
|
+
throw new HttpError(error.condition === 'sidecar_unavailable' ? 503 : 502, error.message);
|
|
523
|
+
}
|
|
524
|
+
})),
|
|
525
|
+
dismiss: os.background.dismiss.handler(({ input, context: { ctx } }) => run(async () => {
|
|
526
|
+
const s = (await visibleSession(ctx, input.session_id));
|
|
527
|
+
const task = (await ctx.deps.background.dismiss(s.session_id, input.task_id));
|
|
412
528
|
if (!task)
|
|
413
529
|
throw new HttpError(404, 'Background task not found');
|
|
414
530
|
return { ok: true, task };
|
|
415
531
|
})),
|
|
416
|
-
ack: os.background.ack.handler(({ input, context: { ctx } }) => run(() => {
|
|
532
|
+
ack: os.background.ack.handler(({ input, context: { ctx } }) => run(async () => {
|
|
417
533
|
const body = input;
|
|
418
534
|
requireField(body, 'session_id');
|
|
419
535
|
const sid = str(body.session_id).trim();
|
|
420
|
-
const s = getSession(ctx, sid, true);
|
|
536
|
+
const s = (await getSession(ctx, sid, true));
|
|
421
537
|
const pid = str(body.task_id || body.process_id).trim();
|
|
422
538
|
if (str(body.process_id).trim())
|
|
423
539
|
ctx.extraResponseHeaders = { deprecation: 'true' };
|
|
@@ -431,31 +547,30 @@ export const chatRouter = os.router({
|
|
|
431
547
|
if (!isSafeSessionId(sid))
|
|
432
548
|
throw new HttpError(404, 'Session not found');
|
|
433
549
|
// Python: a subagent child's context must not be cloned into a runnable ephemeral session.
|
|
434
|
-
if (ctx.deps.sessions.isSubagentViewOnly(sid))
|
|
550
|
+
if ((await ctx.deps.sessions.isSubagentViewOnly(sid)))
|
|
435
551
|
throw new HttpError(400, 'Subagent sessions are view-only and cannot be used for /btw from WebUI');
|
|
436
|
-
|
|
437
|
-
await ctx.deps.sessions.
|
|
438
|
-
const s = getSession(ctx, sid);
|
|
439
|
-
if (ctx.deps.sessions.isReadOnly(s) || s.branchSourceReadonly)
|
|
552
|
+
const s = (await getSession(ctx, sid));
|
|
553
|
+
if ((await ctx.deps.sessions.isReadOnly(s)) || s.branchSourceReadonly)
|
|
440
554
|
throw new HttpError(403, 'Read-only imported sessions cannot be continued from WebUI');
|
|
441
555
|
const question = str(body.question).trim();
|
|
442
556
|
if (!question)
|
|
443
557
|
throw new HttpError(400, 'question is required');
|
|
444
558
|
// TAL-518: a side question runs in its own hidden session, so the chat's running turn does not block it.
|
|
445
559
|
const [model, modelProvider] = ctx.deps.sessions.turnModel(s, {});
|
|
446
|
-
const ephemeral = ctx.deps.sessionStore.newSession({ workspace: s.workspace, model, modelProvider, profile: s.profile });
|
|
560
|
+
const ephemeral = (await ctx.deps.sessionStore.newSession({ workspace: s.workspace, model, modelProvider, profile: s.profile }));
|
|
561
|
+
const context = await ctx.deps.sessions.sideQuestionContext(s);
|
|
447
562
|
ephemeral.messages = structuredClone(s.messages);
|
|
448
|
-
ephemeral.context_messages =
|
|
563
|
+
ephemeral.context_messages = context;
|
|
449
564
|
ephemeral.title = `btw: ${question.slice(0, 60)}`;
|
|
450
|
-
ctx.deps.sessionStore.save(ephemeral);
|
|
565
|
+
await ctx.deps.sessionStore.save(ephemeral);
|
|
451
566
|
// TAL-512: a failed or refused btw turn must not leave its copy of the parent conversation behind.
|
|
452
|
-
const cleanup = () => { try {
|
|
453
|
-
ctx.deps.sessionStore.
|
|
567
|
+
const cleanup = async () => { try {
|
|
568
|
+
(await ctx.deps.sessionStore.delete(ephemeral.session_id, { tombstone: false }));
|
|
454
569
|
}
|
|
455
570
|
catch { /* best effort */ } };
|
|
456
|
-
const started = ctx.deps.turns.start(ephemeral, { msg: question, attachments: [], workspace: s.workspace, model, modelProvider, source: 'webui', ephemeral: true, onFailed: cleanup });
|
|
571
|
+
const started = (await ctx.deps.turns.start(ephemeral, { msg: question, attachments: [], workspace: s.workspace, model, modelProvider, source: 'webui', ephemeral: true, onFailed: cleanup }));
|
|
457
572
|
if (started._status !== undefined && started._status >= 400) {
|
|
458
|
-
cleanup();
|
|
573
|
+
await cleanup();
|
|
459
574
|
throw new HttpError(started._status, started.error ?? 'btw start failed');
|
|
460
575
|
}
|
|
461
576
|
return { stream_id: str(started.stream_id), session_id: ephemeral.session_id, parent_session_id: sid };
|