@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/runtime.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble the application dependencies for one state directory. Used by the
|
|
3
|
+
* launcher and by tests, which pass a temp directory and a fixed environment.
|
|
4
|
+
*/
|
|
5
|
+
import { SIDECAR_METHODS } from '@maudecode/talaria-web-contracts';
|
|
1
6
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
7
|
import { pinnedFetch, systemDnsLookup } from './http/pinned.js';
|
|
3
|
-
import { mkdirSync, readFileSync } from 'node:fs';
|
|
8
|
+
import { mkdirSync, readdirSync, readFileSync } from 'node:fs';
|
|
4
9
|
import { resolve } from 'node:path';
|
|
5
10
|
import { AuthStore } from './auth/store.js';
|
|
6
11
|
import { OidcService } from './auth/oidc.js';
|
|
@@ -9,20 +14,23 @@ import { PresenceLeases, RelayService } from './sessions/relay.js';
|
|
|
9
14
|
import { CliSessionSource } from './sessions/cli-sessions.js';
|
|
10
15
|
import { ClaudeCodeSessionSource, claudeCodeProjectsDir } from './sessions/claude-code.js';
|
|
11
16
|
import { GatewayWatcherRegistry } from './sessions/gateway-watcher.js';
|
|
17
|
+
import { GatewaySessions, gatewayStreamVisible } from './sessions/gateway-sessions.js';
|
|
12
18
|
import { readImportableAgentSessionRowsAsync } from './sessions/state-db.js';
|
|
13
19
|
import { CompletionDrain } from './sessions/completions.js';
|
|
14
20
|
import { BackgroundActivity, BackgroundTaskStore } from './sessions/background-tasks.js';
|
|
15
21
|
import { HygieneTicker } from './tools/hygiene.js';
|
|
22
|
+
import { PruneAdvice } from './tools/prune-advice.js';
|
|
16
23
|
import { McpHealthProber } from './tools/mcp-health.js';
|
|
17
24
|
import { loadConfig, truthy } from './config.js';
|
|
18
25
|
import { checkoutRevision, detectWebuiVersion, loadReleaseInfo } from './release.js';
|
|
19
|
-
import { ghcrExperimental, githubJson, normalizeChannel, purgePycache, UpdateService, waitUntilRestartSafe } from './tools/updates.js';
|
|
26
|
+
import { gatewayDrainDetail, ghcrExperimental, githubJson, normalizeChannel, purgePycache, UpdateService, waitUntilRestartSafe } from './tools/updates.js';
|
|
20
27
|
import { UpdateNotificationStore } from './tools/update-notifications.js';
|
|
21
28
|
import { RESTART_EXIT_CODE } from './cli/supervise.js';
|
|
22
29
|
import { displayBotName, pyBool, SettingsStore } from './settings.js';
|
|
23
30
|
import { AssetCache, SpaShell } from './spa.js';
|
|
24
31
|
import { StartupGate } from './startup.js';
|
|
25
32
|
import { SessionStore } from './sessions/store.js';
|
|
33
|
+
import { JsonStorage } from './sessions/storage/json.js';
|
|
26
34
|
import { DraftStore } from './sessions/drafts.js';
|
|
27
35
|
import { SessionEventBus } from './sessions/events.js';
|
|
28
36
|
import { ShareStore } from './sessions/shares.js';
|
|
@@ -40,9 +48,8 @@ import { EscapeGrants } from './workspace/escape.js';
|
|
|
40
48
|
import { TurnRunner } from './sessions/turn.js';
|
|
41
49
|
import { SessionChannels, StreamRegistry } from './sessions/streams.js';
|
|
42
50
|
import { PendingPrompts } from './sessions/pending.js';
|
|
43
|
-
import { RunJournal } from './sessions/journal.js';
|
|
44
51
|
import { StreamSlots } from './api/sse-routes.js';
|
|
45
|
-
import { AgentConfig, coerceProviderCostBudgetValue, dict as asDict, parseProviderQualifiedModel } from './config/agent-config.js';
|
|
52
|
+
import { AgentConfig, showReasoning, coerceProviderCostBudgetValue, dict as asDict, modelBaseUrl, parseProviderQualifiedModel } from './config/agent-config.js';
|
|
46
53
|
import { ProviderCatalog } from './providers/catalog.js';
|
|
47
54
|
import { containedProfileHome, escapedProfileMessage, ProfileError, ProfileService } from './profiles/profiles.js';
|
|
48
55
|
import { Onboarding } from './onboarding.js';
|
|
@@ -53,7 +60,8 @@ import { CronService } from './tools/crons.js';
|
|
|
53
60
|
import { KanbanService } from './tools/kanban.js';
|
|
54
61
|
import { DashboardPlugins } from './tools/dashboard-plugins.js';
|
|
55
62
|
import { ExtensionService } from './tools/extensions.js';
|
|
56
|
-
import { dashboardStatus } from './tools/health.js';
|
|
63
|
+
import { dashboardStatus, gatewayRestartBlockers, liveGateways } from './tools/health.js';
|
|
64
|
+
import { GatewayRestartQueue, restartGateway } from './tools/gateway-restart.js';
|
|
57
65
|
import { TerminalRegistry } from './tools/terminal.js';
|
|
58
66
|
export function packageVersion() {
|
|
59
67
|
try {
|
|
@@ -63,40 +71,44 @@ export function packageVersion() {
|
|
|
63
71
|
return undefined;
|
|
64
72
|
}
|
|
65
73
|
}
|
|
66
|
-
export function createDeps(opts) {
|
|
74
|
+
export async function createDeps(opts) {
|
|
67
75
|
const log = opts.log ?? ((line) => { console.log(line); });
|
|
68
76
|
const config = loadConfig(opts);
|
|
69
77
|
const env = config.env;
|
|
70
78
|
mkdirSync(config.stateDir, { recursive: true });
|
|
71
79
|
mkdirSync(config.sessionDir, { recursive: true });
|
|
72
|
-
const settings = new SettingsStore({ file: config.settingsFile, env, stateDir: config.stateDir, defaultWorkspace: config.defaultWorkspace, botName: config.botName, log });
|
|
73
80
|
const now = opts.now ?? (() => Date.now() / 1000);
|
|
74
|
-
const
|
|
81
|
+
const storage = opts.storage?.(config) ?? createStorage(config, now, (name) => profileHome(name));
|
|
82
|
+
const settings = new SettingsStore({ documents: storage.documents, env, stateDir: config.stateDir, defaultWorkspace: config.defaultWorkspace, botName: config.botName, log });
|
|
83
|
+
await settings.load();
|
|
84
|
+
const passkeys = new PasskeyStore(storage.documents, now);
|
|
75
85
|
// Resolved below once the sidecar-backed config store exists; the auth store reads it lazily.
|
|
76
86
|
let oidc = null;
|
|
77
87
|
let operatorConfigPeek = () => null;
|
|
78
88
|
const auth = new AuthStore({
|
|
79
|
-
|
|
80
|
-
passkeysEnabled: () => passkeys.available(),
|
|
89
|
+
documents: storage.documents, env, settings, log, now,
|
|
90
|
+
passkeysEnabled: async () => (await passkeys.available()),
|
|
81
91
|
oidcEnabled: () => oidc?.enabledSync() ?? false,
|
|
82
92
|
oidcAvailable: () => oidc?.availableSync() ?? false,
|
|
83
93
|
oidcProbe: () => oidc?.resolve() ?? Promise.resolve(),
|
|
84
94
|
passkeyConfigFlag: () => { const cfg = operatorConfigPeek(); return cfg === null ? null : cfg.webui_passkey_enabled; },
|
|
85
95
|
});
|
|
96
|
+
await auth.initialize();
|
|
86
97
|
settings.hooks = {
|
|
87
|
-
hashPassword: (pw) => auth.hashPassword(pw),
|
|
98
|
+
hashPassword: async (pw) => (await auth.hashPassword(pw)),
|
|
88
99
|
onPasswordChanged: () => { auth.invalidatePasswordHashCache(); },
|
|
89
100
|
};
|
|
90
|
-
settings.applyStartupWorkspace();
|
|
101
|
+
await settings.applyStartupWorkspace();
|
|
91
102
|
config.defaultWorkspace = settings.defaultWorkspace;
|
|
92
103
|
const release = loadReleaseInfo({ webRoot: config.webRoot });
|
|
93
104
|
const stampedRelease = loadReleaseInfo({ webRoot: config.webRoot }, { verifyCheckout: false });
|
|
94
105
|
const runningSourceRevision = checkoutRevision(config.webRoot);
|
|
95
106
|
// Container images bake `TALARIA_WEB_VERSION` (Python `api/_version.py`) because .git is not shipped.
|
|
96
107
|
const version = opts.version ?? detectWebuiVersion(release, config.webRoot, (env.TALARIA_WEB_VERSION ?? '').trim() || packageVersion());
|
|
97
|
-
const updateNotifications = new UpdateNotificationStore(
|
|
108
|
+
const updateNotifications = new UpdateNotificationStore(storage.documents, () => new Date(now() * 1000));
|
|
109
|
+
await updateNotifications.initialize();
|
|
98
110
|
const verifiedRunningVersion = /^web-(?:exp-)?v\d+\.\d+\.\d+$/.test(version) ? version : null;
|
|
99
|
-
updateNotifications.reconcileInterruptedUpdates(runningSourceRevision ?? release.sourceRevision, verifiedRunningVersion);
|
|
111
|
+
await updateNotifications.reconcileInterruptedUpdates(runningSourceRevision ?? release.sourceRevision, verifiedRunningVersion);
|
|
100
112
|
const home = opts.home ?? config.homeDir;
|
|
101
113
|
const PROFILE_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
|
|
102
114
|
// Python `init_profile_state` + `switch_profile(process_wide=False)`: the sticky `~/.hermes/active_profile` is
|
|
@@ -128,7 +140,7 @@ export function createDeps(opts) {
|
|
|
128
140
|
if (profile && !isRootProfile(profile))
|
|
129
141
|
return profile.charAt(0).toUpperCase() + profile.slice(1);
|
|
130
142
|
try {
|
|
131
|
-
return displayBotName(settings.
|
|
143
|
+
return displayBotName(settings.peek().bot_name);
|
|
132
144
|
}
|
|
133
145
|
catch {
|
|
134
146
|
return displayBotName(null);
|
|
@@ -147,11 +159,38 @@ export function createDeps(opts) {
|
|
|
147
159
|
throw new ProfileError(escapedProfileMessage(name), 400);
|
|
148
160
|
return contained;
|
|
149
161
|
};
|
|
162
|
+
const profileNames = () => {
|
|
163
|
+
let names;
|
|
164
|
+
try {
|
|
165
|
+
names = readdirSync(join(baseHome, 'profiles'));
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error.code !== 'ENOENT')
|
|
169
|
+
throw error;
|
|
170
|
+
names = [];
|
|
171
|
+
}
|
|
172
|
+
return names.filter((name) => PROFILE_RE.test(name));
|
|
173
|
+
};
|
|
174
|
+
const agentHomes = () => {
|
|
175
|
+
if (isolatedProfileMode())
|
|
176
|
+
return [baseHome];
|
|
177
|
+
return [...new Set([baseHome, ...profileNames().map(profileHome)])];
|
|
178
|
+
};
|
|
179
|
+
/** Every Agent profile with its home, the root as `default`; a named home outside the profiles root is left out. */
|
|
180
|
+
const agentProfiles = () => {
|
|
181
|
+
if (isolatedProfileMode())
|
|
182
|
+
return [{ name: isolatedProfileName(), home: baseHome }];
|
|
183
|
+
return [{ name: 'default', home: baseHome }, ...profileNames().flatMap((name) => {
|
|
184
|
+
const home = containedProfileHome(baseHome, name);
|
|
185
|
+
return home === null ? [] : [{ name, home }];
|
|
186
|
+
})];
|
|
187
|
+
};
|
|
150
188
|
const attachmentRoot = () => {
|
|
151
189
|
const override = (env.HERMES_WEBUI_ATTACHMENT_DIR ?? '').trim();
|
|
152
190
|
return resolvePathLikePython(override ? override.replace(/^~(?=$|\/)/, home) : join(config.stateDir, 'attachments'));
|
|
153
191
|
};
|
|
154
192
|
const sidecar = opts.sidecar ?? null;
|
|
193
|
+
const pruneAdvice = new PruneAdvice({ sidecar: () => deps.sidecar(), profiles: agentProfiles, lease: (name) => deps.profiles.beginWrite(name), notifications: updateNotifications, now, log });
|
|
155
194
|
const agentConfig = new AgentConfig({ sidecar: () => sidecar, env });
|
|
156
195
|
/** A profile's config.yaml `model` as [model, provider] as written; '' / null when unset or not yet read. */
|
|
157
196
|
const profileDefaultModel = (profile) => {
|
|
@@ -168,12 +207,12 @@ export function createDeps(opts) {
|
|
|
168
207
|
return [typeof d === 'string' ? d.trim() : '', typeof p === 'string' && p ? p : null];
|
|
169
208
|
};
|
|
170
209
|
const events = new SessionEventBus(isRootProfile);
|
|
171
|
-
const drafts = new DraftStore(
|
|
172
|
-
const registry = new StreamRegistry();
|
|
210
|
+
const drafts = new DraftStore(storage.documents);
|
|
211
|
+
const registry = new StreamRegistry((id) => gatewayStreamVisible(id, profileHome(activeProfile())));
|
|
173
212
|
const activeStreamIds = registry.liveIds;
|
|
174
213
|
const runningCronJobs = new Map();
|
|
175
214
|
const workspaces = new WorkspaceRegistry({
|
|
176
|
-
|
|
215
|
+
documents: storage.documents,
|
|
177
216
|
defaultWorkspace: () => config.defaultWorkspace,
|
|
178
217
|
profileHome,
|
|
179
218
|
activeProfile,
|
|
@@ -192,34 +231,34 @@ export function createDeps(opts) {
|
|
|
192
231
|
return Number.isFinite(raw) && raw >= 1 ? raw : 100;
|
|
193
232
|
};
|
|
194
233
|
const store = new SessionStore({
|
|
195
|
-
|
|
234
|
+
storage,
|
|
196
235
|
drafts,
|
|
197
236
|
events,
|
|
198
237
|
// Python `_profile_default_model_state`: the profile's own config.yaml model, else the global default. The provider
|
|
199
238
|
// always comes with its model, so a provider-only profile never pairs with another profile's model.
|
|
200
|
-
defaults: (profile) => {
|
|
239
|
+
defaults: async (profile) => {
|
|
201
240
|
let [model, provider] = profileDefaultModel(profile);
|
|
202
241
|
if (!model) {
|
|
203
|
-
const s = settings.
|
|
242
|
+
const s = settings.peek();
|
|
204
243
|
model = typeof s.default_model === 'string' ? s.default_model : '';
|
|
205
244
|
provider = model && typeof s.default_model_provider === 'string' && s.default_model_provider ? s.default_model_provider : null;
|
|
206
245
|
}
|
|
207
246
|
const [bare, modelProvider] = parseProviderQualifiedModel(model) ?? [model || null, provider];
|
|
208
|
-
return { workspace: workspaces.lastWorkspace(profile), model: bare, modelProvider };
|
|
247
|
+
return { workspace: (await workspaces.lastWorkspace(profile)), model: bare, modelProvider };
|
|
209
248
|
},
|
|
210
249
|
activeStreamIds: () => activeStreamIds,
|
|
211
250
|
now,
|
|
212
251
|
log,
|
|
213
252
|
cacheMax,
|
|
214
|
-
onDeleted: (sid) => { backgroundStore.
|
|
253
|
+
onDeleted: async (sid) => { (await backgroundStore.delete(sid)); },
|
|
215
254
|
});
|
|
216
|
-
const projects = new ProjectStore(
|
|
217
|
-
const shares = new ShareStore(
|
|
255
|
+
const projects = new ProjectStore(storage.documents, async () => (await store.readIndexEntries()), isRootProfile);
|
|
256
|
+
const shares = new ShareStore(storage.documents, now);
|
|
218
257
|
const yoloSessions = new Set();
|
|
219
258
|
const attachmentDir = (sid) => join(attachmentRoot(), (sid || 'session').replace(/[^\w.-]/g, '_').slice(0, 120));
|
|
220
|
-
const cliSessions = new CliSessionSource({ store, profileHome, lastWorkspace: (p) => workspaces.lastWorkspace(p), backgroundProjectId: (kind, p) => projects.ensureSystemProject(kind, p, { create: kind === 'webhook' || projects.hasUserProjects(p) }), now, log });
|
|
221
|
-
const gatewayWatchers = new GatewayWatcherRegistry({ profileHome, now, log, ...(opts.gatewayPollMs !== undefined ? { pollIntervalMs: opts.gatewayPollMs } : {}) });
|
|
222
|
-
const journal =
|
|
259
|
+
const cliSessions = new CliSessionSource({ store, profileHome, profilesMatch, lastWorkspace: async (p) => (await workspaces.lastWorkspace(p)), backgroundProjectId: async (kind, p) => (await projects.ensureSystemProject(kind, p, { create: kind === 'webhook' || (await projects.hasUserProjects(p)) })), now, log });
|
|
260
|
+
const gatewayWatchers = new GatewayWatcherRegistry({ profileHome, rows: (profile) => cliSessions.read(profile), now, log, ...(opts.gatewayPollMs !== undefined ? { pollIntervalMs: opts.gatewayPollMs } : {}) });
|
|
261
|
+
const journal = storage.journals;
|
|
223
262
|
const contextLengths = new Map();
|
|
224
263
|
const contextInflight = new Map();
|
|
225
264
|
const contextKey = (model, provider, profile) => (model?.trim() ? `${profileHome(profile ?? activeProfile())}\0${provider?.trim() ?? ''}\0${model.trim()}` : null);
|
|
@@ -259,11 +298,11 @@ export function createDeps(opts) {
|
|
|
259
298
|
profileOps.delete(key);
|
|
260
299
|
};
|
|
261
300
|
};
|
|
262
|
-
const mediaActiveWorkspace = () => {
|
|
301
|
+
const mediaActiveWorkspace = async () => {
|
|
263
302
|
if (!workspaces.profileSupportsLocalIo(null))
|
|
264
303
|
return null;
|
|
265
304
|
try {
|
|
266
|
-
const ws = resolvePathLikePython(workspaces.lastWorkspace(activeProfile()));
|
|
305
|
+
const ws = resolvePathLikePython((await workspaces.lastWorkspace(activeProfile())));
|
|
267
306
|
return statSync(ws).isDirectory() ? ws : null;
|
|
268
307
|
}
|
|
269
308
|
catch {
|
|
@@ -275,39 +314,48 @@ export function createDeps(opts) {
|
|
|
275
314
|
const mediaAccess = { home: config.homeDir, hermesHome: config.hermesHome, extraRoots: env.MEDIA_ALLOWED_ROOTS ?? '', activeWorkspace: mediaActiveWorkspace, policy: mediaPolicy };
|
|
276
315
|
// TAL-259: record when this server started stamping deliberate shrinks; older backups go to manual review.
|
|
277
316
|
try {
|
|
278
|
-
recoveryStampingSince(
|
|
317
|
+
await recoveryStampingSince(storage.documents);
|
|
279
318
|
}
|
|
280
319
|
catch (error) {
|
|
281
320
|
log(`[webui] WARNING: could not record recovery_stamping_since: ${error.message}`);
|
|
282
321
|
}
|
|
283
322
|
const sessions = new SessionService({
|
|
284
|
-
recoveryStampingSince: () => recoveryStampingSince(
|
|
323
|
+
recoveryStampingSince: async () => await recoveryStampingSince(storage.documents),
|
|
285
324
|
sidecar: () => sidecar,
|
|
286
325
|
media: { access: mediaAccess, localIo: (profile) => workspaces.profileSupportsLocalIo(profile) },
|
|
287
326
|
profileActivity,
|
|
288
327
|
profileDeleting: (profile) => profiles.isDeleting(profile),
|
|
289
|
-
backgroundReceipts: (sid) => background.receipts(sid),
|
|
328
|
+
backgroundReceipts: async (sid) => (await background.receipts(sid)),
|
|
329
|
+
backgroundPending: async (sid) => (await completions.pendingDelegations(sid)),
|
|
290
330
|
journal,
|
|
291
|
-
clearRelayCompletions: (sid, profile) => { relay.clearDeleted(sid, profile); },
|
|
331
|
+
clearRelayCompletions: async (sid, profile) => { (await relay.clearDeleted(sid, profile)); },
|
|
292
332
|
store,
|
|
293
|
-
cliSessions: (profile, o) => cliSessions.read(profile, o),
|
|
294
|
-
cliSessionsSync: (profile, o) => cliSessions.readSync(profile, o),
|
|
333
|
+
cliSessions: async (profile, o) => (await cliSessions.read(profile, o)),
|
|
295
334
|
claudeCode: new ClaudeCodeSessionSource(() => claudeCodeProjectsDir(env, home)),
|
|
296
335
|
profileHome,
|
|
297
336
|
// The commit runs detached from the request, so it is registered as profile activity until it settles: profile
|
|
298
337
|
// deletion must not remove the memory files the cached Agent is still writing.
|
|
299
|
-
commitSessionMemory: (sid) => {
|
|
338
|
+
commitSessionMemory: async (sid) => {
|
|
300
339
|
if (!sidecar)
|
|
301
340
|
return;
|
|
341
|
+
const callerProfile = activeProfile();
|
|
342
|
+
// Reserve deletion protection before the asynchronous lookup knows which profile owns the session.
|
|
343
|
+
let release = profileActivity('*');
|
|
302
344
|
let profile = null;
|
|
303
345
|
try {
|
|
304
|
-
profile = store.get(sid, { metadataOnly: true }).profile ?? null;
|
|
346
|
+
profile = (await store.get(sid, { metadataOnly: true })).profile ?? null;
|
|
305
347
|
}
|
|
306
348
|
catch {
|
|
307
349
|
profile = null;
|
|
308
350
|
}
|
|
309
|
-
const
|
|
310
|
-
|
|
351
|
+
const targetProfile = profile ?? callerProfile;
|
|
352
|
+
const releaseOwner = profileActivity(targetProfile);
|
|
353
|
+
release();
|
|
354
|
+
release = releaseOwner;
|
|
355
|
+
void Promise.resolve().then(async () => {
|
|
356
|
+
await sessions.assertWritable(sid, targetProfile);
|
|
357
|
+
return sidecar.call('chat.commit_memory', { profile_home: profileHome(targetProfile), session_id: sid });
|
|
358
|
+
})
|
|
311
359
|
.catch((error) => { log(`[webui] memory commit for ${sid} failed: ${error.message}`); })
|
|
312
360
|
.finally(release);
|
|
313
361
|
},
|
|
@@ -330,12 +378,12 @@ export function createDeps(opts) {
|
|
|
330
378
|
profilesMatch,
|
|
331
379
|
assistantName,
|
|
332
380
|
redactEnabled: () => { try {
|
|
333
|
-
return settings.
|
|
381
|
+
return settings.peek().api_redact_enabled !== false;
|
|
334
382
|
}
|
|
335
383
|
catch {
|
|
336
384
|
return true;
|
|
337
385
|
} },
|
|
338
|
-
pinnedSessionsLimit: () => { const v = settings.
|
|
386
|
+
pinnedSessionsLimit: () => { const v = settings.peek().pinned_sessions_limit; return typeof v === 'number' && v >= 1 ? v : 3; },
|
|
339
387
|
// Chat runtime (checkpoint 6) replaces these with live stream and cron state.
|
|
340
388
|
runtime: {
|
|
341
389
|
activeStreamIds,
|
|
@@ -354,13 +402,21 @@ export function createDeps(opts) {
|
|
|
354
402
|
activeRunStream: (sid) => registry.activeRunStreamForSession(sid),
|
|
355
403
|
journalDegraded: (streamId) => registry.degradedJournals.has(streamId),
|
|
356
404
|
pendingSteers: (streamId) => turns.pendingSteers(streamId),
|
|
357
|
-
|
|
405
|
+
runStatus: (streamId) => turns.runStatus(streamId),
|
|
406
|
+
liveToolProgress: (streamId) => turns.liveToolProgress(streamId),
|
|
407
|
+
compressionStartedAt: (streamId) => turns.compressionStartedAt(streamId),
|
|
408
|
+
automaticTurnsHeld: async (sid) => (await turns.automaticTurnsHeld(sid)),
|
|
409
|
+
sessionNotices: (sid) => turns.sessionNotices(sid),
|
|
410
|
+
sessionGoal: (sid) => turns.sessionGoal(sid),
|
|
411
|
+
evictAgent: async (sid, endSession) => { if (sidecar && (!endSession || !(await sessions.readOnlyReason(sid))))
|
|
358
412
|
sidecar.call('chat.evict_agent', endSession ? { session_id: sid, clear_session: true } : { session_id: sid }).catch(() => undefined); },
|
|
359
413
|
closeTerminal: (sid) => { deps.terminals.close(sid); },
|
|
360
414
|
deleteCliSession: async (profile, sid) => {
|
|
361
415
|
if (!sidecar)
|
|
362
|
-
return false;
|
|
363
|
-
|
|
416
|
+
return { ok: false };
|
|
417
|
+
const targetProfile = profile ?? activeProfile();
|
|
418
|
+
await sessions.assertWritable(sid, targetProfile);
|
|
419
|
+
return await sidecar.call('state_db.delete_cli_session', { profile_home: profileHome(targetProfile), session_id: sid, include_compression_lineage: true });
|
|
364
420
|
},
|
|
365
421
|
},
|
|
366
422
|
attachmentDir,
|
|
@@ -368,11 +424,13 @@ export function createDeps(opts) {
|
|
|
368
424
|
home,
|
|
369
425
|
// Python `_sync_session_title_to_state_db`: with `sync_to_insights` on, the state.db row follows a rename.
|
|
370
426
|
syncTitle: async (session, manual) => {
|
|
371
|
-
if (!sidecar || !pyBool(settings.
|
|
427
|
+
if (!sidecar || !pyBool(settings.peek().sync_to_insights))
|
|
372
428
|
return;
|
|
373
429
|
// Awaited by callers: the rename/regenerate response and the title stream's teardown follow the state.db write.
|
|
374
430
|
try {
|
|
375
|
-
|
|
431
|
+
const targetProfile = session.profile ?? activeProfile();
|
|
432
|
+
await sessions.assertWritable(session, targetProfile);
|
|
433
|
+
await sidecar.call('state_db.sync_title', { profile_home: profileHome(targetProfile), session_id: session.session_id, title: session.title, manual: manual === true });
|
|
376
434
|
}
|
|
377
435
|
catch (error) {
|
|
378
436
|
log(`[webui] state.db title sync failed for ${session.session_id}: ${error.message}`);
|
|
@@ -407,6 +465,12 @@ export function createDeps(opts) {
|
|
|
407
465
|
provider = currentProvider;
|
|
408
466
|
return [raw, provider];
|
|
409
467
|
},
|
|
468
|
+
profileLaunchRoute: (profile, provider) => {
|
|
469
|
+
const config = agentConfig.peek(profileHome(profile));
|
|
470
|
+
const baseUrl = config ? modelBaseUrl(config, provider) : '';
|
|
471
|
+
// A bypass owner reads no custom_providers entry, so a named custom endpoint launches as `custom` at its own URL.
|
|
472
|
+
return { provider: baseUrl && provider.toLowerCase().startsWith('custom:') ? 'custom' : provider, baseUrl: baseUrl || null };
|
|
473
|
+
},
|
|
410
474
|
repairSessionModel: (profile, model, provider) => catalog.sessionModelRepair(profileHome(profile ?? activeProfile()), model, provider),
|
|
411
475
|
warmSessionModelRepair: (profile) => catalog.warmSessionModelRepair(profileHome(profile ?? activeProfile())),
|
|
412
476
|
yolo: { isEnabled: (sid) => yoloSessions.has(sid), set: (sid, enabled) => { if (enabled)
|
|
@@ -417,25 +481,21 @@ export function createDeps(opts) {
|
|
|
417
481
|
// A working-tree mutation refuses while a run is active anywhere it would change files.
|
|
418
482
|
const git = new GitRunner({ env, activeRunIn: (path) => [...registry.activeRuns.values()].some((run) => Boolean(run.workspace) && pathsOverlap(run.workspace, path)) });
|
|
419
483
|
const rollback = new RollbackStore({
|
|
420
|
-
sidecar: () => sidecar, profileHome: () => profileHome(activeProfile()), knownWorkspaces: () => workspaces.load(activeProfile()).map((w) => w.path),
|
|
484
|
+
sidecar: () => sidecar, profileHome: () => profileHome(activeProfile()), knownWorkspaces: async () => (await workspaces.load(activeProfile())).map((w) => w.path),
|
|
421
485
|
// A run whose session cannot be read counts as one in the profile: refusing is the safe answer.
|
|
422
486
|
activeRunInProfile: (home) => [...registry.activeRuns.values()].some((run) => {
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
}
|
|
426
|
-
catch {
|
|
427
|
-
return true;
|
|
428
|
-
}
|
|
487
|
+
const session = store.sessions.get(run.session_id);
|
|
488
|
+
return !session || profileHome(session.profile ?? activeProfile()) === home;
|
|
429
489
|
}),
|
|
430
490
|
});
|
|
431
491
|
const uploads = new UploadInbox(attachmentRoot);
|
|
432
|
-
const channels = new SessionChannels();
|
|
492
|
+
const channels = new SessionChannels(activeProfile, profileHome);
|
|
433
493
|
const pending = new PendingPrompts(events, now);
|
|
434
494
|
// TAL-372: one durable record per piece of background work; a change refreshes every client showing the session.
|
|
435
|
-
const backgroundStore = new BackgroundTaskStore(
|
|
495
|
+
const backgroundStore = new BackgroundTaskStore(storage.documents, now, async (sid) => {
|
|
436
496
|
let profile = null;
|
|
437
497
|
try {
|
|
438
|
-
profile = store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }).profile;
|
|
498
|
+
profile = (await store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false })).profile;
|
|
439
499
|
}
|
|
440
500
|
catch {
|
|
441
501
|
profile = null;
|
|
@@ -450,14 +510,21 @@ export function createDeps(opts) {
|
|
|
450
510
|
const relay = new RelayService({
|
|
451
511
|
registry, pending, store, presence: new PresenceLeases(now), profileHome, profilesMatch, fetch: () => lazyFetch, now, log,
|
|
452
512
|
agentSessions: (profile) => readImportableAgentSessionRowsAsync(join(profileHome(profile), 'state.db')),
|
|
453
|
-
|
|
513
|
+
documents: storage.documents, env, canonicalProfile: (p) => (isRootProfile(p) ? 'default' : p), addListener: (listener) => events.addListener(listener),
|
|
454
514
|
});
|
|
455
515
|
const turns = new TurnRunner({
|
|
516
|
+
notifications: updateNotifications,
|
|
517
|
+
notificationOwner: () => {
|
|
518
|
+
const request = requestScope.getStore();
|
|
519
|
+
return request ? request.notificationOwner ?? 'local-owner' : null;
|
|
520
|
+
},
|
|
456
521
|
store,
|
|
457
522
|
service: () => sessions,
|
|
458
523
|
events,
|
|
459
524
|
onTerminal: (streamId, phase) => { relay.noteTerminal(streamId, phase); },
|
|
525
|
+
onTurnStart: () => { completions.wake(); },
|
|
460
526
|
onTurnEnd: (sessionId) => { void completions.drainDeferred(sessionId); },
|
|
527
|
+
onBackgroundWork: (sessionId, profile) => { background.refresh(sessionId, profile); completions.wake(); },
|
|
461
528
|
profileDeleting: (profile) => profiles.isDeleting(profile),
|
|
462
529
|
updateInProgress: () => deps.updates.blocksNewWork(),
|
|
463
530
|
workspaceBusy: (workspace) => deps.git.workspaceBusy(workspace),
|
|
@@ -465,11 +532,13 @@ export function createDeps(opts) {
|
|
|
465
532
|
syncTitle: (session) => sessions.deps.syncTitle(session),
|
|
466
533
|
// Python `sync_session_usage` after a settled turn: with `sync_to_insights` on, the state.db row carries the usage.
|
|
467
534
|
syncUsage: async (session, model) => {
|
|
468
|
-
if (!sidecar || !pyBool(settings.
|
|
535
|
+
if (!sidecar || !pyBool(settings.peek().sync_to_insights))
|
|
469
536
|
return;
|
|
470
537
|
try {
|
|
538
|
+
const targetProfile = session.profile ?? activeProfile();
|
|
539
|
+
await sessions.assertWritable(session, targetProfile);
|
|
471
540
|
await sidecar.call('state_db.sync_usage', {
|
|
472
|
-
profile_home: profileHome(
|
|
541
|
+
profile_home: profileHome(targetProfile), session_id: session.session_id,
|
|
473
542
|
input_tokens: session.input_tokens || 0, output_tokens: session.output_tokens || 0, estimated_cost: typeof session.estimated_cost === 'number' ? session.estimated_cost : null,
|
|
474
543
|
cache_read_tokens: session.cache_read_tokens || 0, cache_write_tokens: session.cache_write_tokens || 0,
|
|
475
544
|
model, title: session.title, message_count: session.messages.length,
|
|
@@ -486,8 +555,10 @@ export function createDeps(opts) {
|
|
|
486
555
|
catch {
|
|
487
556
|
return null;
|
|
488
557
|
} },
|
|
558
|
+
personalities: (profile) => agentConfig.agentPersonalities(profileHome(profile ?? activeProfile())),
|
|
559
|
+
providerLabel: (profile, provider) => catalog.providerLabel(profileHome(profile ?? activeProfile()), provider),
|
|
489
560
|
titleRefreshEvery: () => { try {
|
|
490
|
-
const every = Number(settings.
|
|
561
|
+
const every = Number(settings.peek().auto_title_refresh_every);
|
|
491
562
|
return Number.isInteger(every) && every > 0 ? every : 0;
|
|
492
563
|
}
|
|
493
564
|
catch {
|
|
@@ -507,7 +578,7 @@ export function createDeps(opts) {
|
|
|
507
578
|
now,
|
|
508
579
|
log,
|
|
509
580
|
redactEnabled: () => { try {
|
|
510
|
-
return settings.
|
|
581
|
+
return settings.peek().api_redact_enabled !== false;
|
|
511
582
|
}
|
|
512
583
|
catch {
|
|
513
584
|
return true;
|
|
@@ -518,7 +589,7 @@ export function createDeps(opts) {
|
|
|
518
589
|
});
|
|
519
590
|
// Services read `deps.fetch` lazily so tests can swap the outbound HTTP client after boot.
|
|
520
591
|
const lazyFetch = (input, init) => deps.fetch(input, init);
|
|
521
|
-
const catalog = new ProviderCatalog({ sidecar: () => sidecar, config: agentConfig, env, now, log, costBudget: () => coerceProviderCostBudgetValue(settings.
|
|
592
|
+
const catalog = new ProviderCatalog({ sidecar: () => sidecar, config: agentConfig, env, now, log, costBudget: () => coerceProviderCostBudgetValue(settings.peek().provider_cost_budget), quotaThresholds: async (profile) => (await settings.quotaThresholds(profile)), isRootProfileHome: (h) => resolvePathLikePython(h) === resolvePathLikePython(config.hermesHome), documents: storage.documents });
|
|
522
593
|
const agentStatus = () => {
|
|
523
594
|
const describe = sidecar?.describe ?? null;
|
|
524
595
|
const found = Boolean(describe?.agent_dir);
|
|
@@ -527,12 +598,13 @@ export function createDeps(opts) {
|
|
|
527
598
|
};
|
|
528
599
|
const profiles = new ProfileService({
|
|
529
600
|
sidecar: () => sidecar,
|
|
601
|
+
forgetProfile: (name) => pruneAdvice.forget(name),
|
|
530
602
|
baseHome,
|
|
531
603
|
profileHome,
|
|
532
604
|
isolatedProfileMode,
|
|
533
605
|
isolatedProfileName,
|
|
534
606
|
config: agentConfig,
|
|
535
|
-
defaultWorkspace: (profile) => workspaces.profileDefaultWorkspace(profile),
|
|
607
|
+
defaultWorkspace: async (profile) => (await workspaces.profileDefaultWorkspace(profile)),
|
|
536
608
|
models: (h) => catalog.models(h),
|
|
537
609
|
streamsActive: () => activeStreamIds.size > 0,
|
|
538
610
|
profileRunsActive: (name) => {
|
|
@@ -548,23 +620,22 @@ export function createDeps(opts) {
|
|
|
548
620
|
}
|
|
549
621
|
for (const sessionId of sessionIds) {
|
|
550
622
|
let profile = null;
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
continue;
|
|
556
|
-
}
|
|
623
|
+
const session = store.sessions.get(sessionId);
|
|
624
|
+
if (!session)
|
|
625
|
+
return true;
|
|
626
|
+
profile = session.profile ?? null;
|
|
557
627
|
if (profiles.isRootProfile(profile ?? 'default') ? profiles.isRootProfile(name) : profile === name)
|
|
558
628
|
return true;
|
|
559
629
|
}
|
|
560
630
|
for (const [profile, count] of profileOps)
|
|
561
|
-
if (count > 0 && (profiles.isRootProfile(profile) ? profiles.isRootProfile(name) : profile === name))
|
|
631
|
+
if (count > 0 && (profile === '*' || (profiles.isRootProfile(profile) ? profiles.isRootProfile(name) : profile === name)))
|
|
562
632
|
return true;
|
|
563
633
|
return false;
|
|
564
634
|
},
|
|
565
|
-
|
|
635
|
+
documents: storage.documents,
|
|
566
636
|
log,
|
|
567
637
|
}, now);
|
|
638
|
+
await profiles.initialize();
|
|
568
639
|
rootAlias = (name) => profiles.isRootProfile(name);
|
|
569
640
|
const onboarding = new Onboarding({
|
|
570
641
|
settings,
|
|
@@ -575,7 +646,7 @@ export function createDeps(opts) {
|
|
|
575
646
|
sidecar: () => sidecar,
|
|
576
647
|
agentStatus,
|
|
577
648
|
isAuthEnabled: () => auth.isAuthEnabled(),
|
|
578
|
-
workspaces: () => ({ items: workspaces.load(activeProfile()), last: workspaces.lastWorkspace(activeProfile()) }),
|
|
649
|
+
workspaces: async () => ({ items: (await workspaces.load(activeProfile())), last: (await workspaces.lastWorkspace(activeProfile())) }),
|
|
579
650
|
models: (h) => catalog.models(h),
|
|
580
651
|
defaultWorkspace: () => config.defaultWorkspace,
|
|
581
652
|
defaultModel: () => (env.HERMES_WEBUI_DEFAULT_MODEL ?? '').trim(),
|
|
@@ -625,14 +696,12 @@ export function createDeps(opts) {
|
|
|
625
696
|
},
|
|
626
697
|
};
|
|
627
698
|
};
|
|
628
|
-
completions = new CompletionDrain({ sidecar: () => sidecar, configPath: (home) => agentConfig.path(home), baseHome, profileHome: (p) => profileHome(p ?? activeProfile()), activeProfile, store, channels, registry, startTurn: async (session, prompt) => {
|
|
699
|
+
completions = new CompletionDrain({ documents: storage.documents, sidecar: () => sidecar, configPath: (home) => agentConfig.path(home), readConfig: (home) => agentConfig.read(home), env, baseHome, profileHome: (p) => profileHome(p ?? activeProfile()), activeProfile, store, channels, registry, isReadOnly: async (session) => (await sessions.isReadOnly(session)), startTurn: async (session, prompt, completionKeys, backgroundUpdate) => {
|
|
629
700
|
// TAL-577: a wakeup passes the user-turn admission; a stale runtime answers a retryable 409, which defers it on a retry timer.
|
|
630
701
|
// TAL-542: its model repair reads the cached catalog only (Python `prefer_cached_catalog`), never waiting on a build.
|
|
631
702
|
try {
|
|
632
703
|
await ensureAgentRuntimeCurrent(sidecar);
|
|
633
|
-
|
|
634
|
-
const [model, modelProvider] = sessions.turnModel(session);
|
|
635
|
-
return turns.start(session, { msg: prompt, attachments: [], workspace, model, modelProvider, source: 'process_wakeup' });
|
|
704
|
+
return (await turns.startServerTurn(session, { msg: prompt, source: 'process_wakeup', completionKeys, backgroundUpdate }));
|
|
636
705
|
}
|
|
637
706
|
catch (error) {
|
|
638
707
|
if (error instanceof HttpFailure)
|
|
@@ -657,6 +726,8 @@ export function createDeps(opts) {
|
|
|
657
726
|
catch {
|
|
658
727
|
return false;
|
|
659
728
|
} };
|
|
729
|
+
sessions.owner = new GatewaySessions({ service: sessions, sidecar: () => sidecar, registry, journal, events, channels,
|
|
730
|
+
profileHome, activeProfile, showReasoning: async (home) => showReasoning(await agentConfig.read(home)), redactEnabled: sessions.deps.redactEnabled, now, log });
|
|
660
731
|
const deps = {
|
|
661
732
|
config,
|
|
662
733
|
settings,
|
|
@@ -675,7 +746,7 @@ export function createDeps(opts) {
|
|
|
675
746
|
requestScope,
|
|
676
747
|
isRootProfile,
|
|
677
748
|
assistantName,
|
|
678
|
-
onboardingCompleted: () => truthy(env.HERMES_WEBUI_SKIP_ONBOARDING) || Boolean(settings.
|
|
749
|
+
onboardingCompleted: () => truthy(env.HERMES_WEBUI_SKIP_ONBOARDING) || Boolean(settings.peek().onboarding_completed),
|
|
679
750
|
health: () => ({ sessions: store.sessions.size, activeStreams: activeStreamIds.size, activeRuns: registry.activeRuns.size, runs: [...registry.activeRuns.values()].map((r) => ({ phase: r.phase, started_at: r.started_at })), lastRunFinishedAt: registry.lastRunFinishedAt }),
|
|
680
751
|
sessions,
|
|
681
752
|
sessionStore: store,
|
|
@@ -721,11 +792,11 @@ export function createDeps(opts) {
|
|
|
721
792
|
oidc,
|
|
722
793
|
passkeys,
|
|
723
794
|
nativeOidcLimiter: new WindowLimiter(60, 10, now),
|
|
724
|
-
clearPasskeys: () => { passkeys.clear(); },
|
|
795
|
+
clearPasskeys: async () => { (await passkeys.clear()); },
|
|
725
796
|
skills: new SkillsService({ sidecar: () => sidecar, config: agentConfig, log }),
|
|
726
797
|
mcp: new McpService({ sidecar: () => sidecar, config: agentConfig, health: mcpHealth }),
|
|
727
798
|
completions,
|
|
728
|
-
hygiene: new HygieneTicker({ env, stateDir: config.stateDir, port: () => config.port, journal,
|
|
799
|
+
hygiene: new HygieneTicker({ env, stateDir: config.stateDir, port: () => config.port, journal, now, log, sweeps: [() => { completions.sweep(); }, async () => { (await turns.sweep()); }, () => pruneAdvice.sweep()] }),
|
|
729
800
|
mcpHealth,
|
|
730
801
|
nowSeconds: now,
|
|
731
802
|
// Python `_webui_runtime_payload`: the four owner sections with their `available` flags.
|
|
@@ -744,12 +815,15 @@ export function createDeps(opts) {
|
|
|
744
815
|
requestShutdown: () => { setTimeout(() => { process.kill(process.pid, 'SIGINT'); }, 300).unref(); },
|
|
745
816
|
// Embedded shells are separate process groups that would outlive the worker: terminate and reap them on both exits.
|
|
746
817
|
// A running retention sweep stops before the exit, like on shutdown.
|
|
747
|
-
requestRestart: () => { void waitUntilRestartSafe(restartBlockers, { log }).then(() => deps.hygiene.stop()).then(() => auth.flushPersistence()).then(() => { deps.terminals.closeAll({ immediate: true }); purgeAgentPycache(); process.exit(RESTART_EXIT_CODE); }); },
|
|
818
|
+
requestRestart: () => { void waitUntilRestartSafe(restartBlockers, { log }).then(() => deps.gatewayRestarts.quiesce()).then(() => deps.hygiene.stop()).then(() => auth.flushPersistence()).then(() => store.close()).then(() => { deps.terminals.closeAll({ immediate: true }); purgeAgentPycache(); process.exit(RESTART_EXIT_CODE); }); },
|
|
748
819
|
updates: null,
|
|
749
820
|
updateNotifications,
|
|
821
|
+
pruneAdvice,
|
|
822
|
+
gatewayRestarts: null,
|
|
750
823
|
cspLimiter: new WindowLimiter(60, 100, now),
|
|
751
824
|
clientEventLimiter: new WindowLimiter(60, 30, now),
|
|
752
825
|
ttsLimiter: new WindowLimiter(2, 1, now),
|
|
826
|
+
profileActivity,
|
|
753
827
|
fetch: opts.fetch ?? fetch,
|
|
754
828
|
dnsLookup: systemDnsLookup,
|
|
755
829
|
pinnedFetch,
|
|
@@ -762,11 +836,12 @@ export function createDeps(opts) {
|
|
|
762
836
|
log,
|
|
763
837
|
publishSessionsChanged: (reason, profile) => { events.publish(reason, { profile }); },
|
|
764
838
|
runningJobs: runningCronJobs,
|
|
765
|
-
|
|
839
|
+
updateInProgress: () => deps.updates.blocksNewWork(),
|
|
840
|
+
modelOptions: (home) => catalog.modelOptionResolver(home),
|
|
766
841
|
}),
|
|
767
842
|
kanban: new KanbanService({ sidecar: () => sidecar, config: agentConfig }),
|
|
768
|
-
extensions: new ExtensionService({ env, stateDir: config.stateDir, isAuthEnabled: () => auth.isAuthEnabled(), fetch: lazyFetch, log }),
|
|
769
|
-
dashboardPlugins: new DashboardPlugins({ env, hermesHome: config.hermesHome, settings }),
|
|
843
|
+
extensions: new ExtensionService({ documents: storage.documents, env, stateDir: config.stateDir, isAuthEnabled: () => auth.isAuthEnabled(), fetch: lazyFetch, log }),
|
|
844
|
+
dashboardPlugins: new DashboardPlugins({ env, hermesHome: config.hermesHome, settings, sidecar: () => sidecar }),
|
|
770
845
|
terminals,
|
|
771
846
|
commitMessage: async (session, systemPrompt, userPrompt) => {
|
|
772
847
|
if (!sidecar)
|
|
@@ -790,6 +865,12 @@ export function createDeps(opts) {
|
|
|
790
865
|
};
|
|
791
866
|
const purgeAgentPycache = () => { const dir = sidecar?.describe?.agent_dir; if (dir)
|
|
792
867
|
purgePycache(dir); };
|
|
868
|
+
const agentDrain = (frame) => {
|
|
869
|
+
const parsed = SIDECAR_METHODS['runtime.agent_mutation'].stream.safeParse({ event: frame.event, data: frame.data });
|
|
870
|
+
return parsed.success ? parsed.data.data : null;
|
|
871
|
+
};
|
|
872
|
+
let recoveredAgentRevision = null;
|
|
873
|
+
let pendingRuntimeRecovery = null;
|
|
793
874
|
deps.updates = new UpdateService({
|
|
794
875
|
webRoot: config.webRoot,
|
|
795
876
|
getJson: githubJson(lazyFetch, env),
|
|
@@ -805,22 +886,122 @@ export function createDeps(opts) {
|
|
|
805
886
|
return deps.version;
|
|
806
887
|
},
|
|
807
888
|
agentDir: () => sidecar?.describe?.agent_dir ?? null,
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
889
|
+
agentHomes,
|
|
890
|
+
...(sidecar?.onHandshake ? { onAgentReconnect: (listener) => sidecar.onHandshake(listener) } : {}),
|
|
891
|
+
recoverAgent: async (probe = false, signal) => {
|
|
892
|
+
if (!sidecar)
|
|
893
|
+
throw new Error('Hermes Agent sidecar is unavailable for recovery.');
|
|
894
|
+
if (sidecar.status === 'starting' || sidecar.status === 'restarting' || sidecar.status === 'stopped')
|
|
895
|
+
throw new Error('Agent recovery is waiting for its sidecar connection.');
|
|
896
|
+
let completeRevision = null;
|
|
897
|
+
if (!probe && pendingRuntimeRecovery?.runtime_pending && recoveredAgentRevision) {
|
|
898
|
+
const current = await sidecar.call('runtime.status', {}, { ...(signal ? { signal } : {}), timeoutMs: 5000 });
|
|
899
|
+
if (signal?.aborted)
|
|
900
|
+
throw new Error('Agent recovery was cancelled.');
|
|
901
|
+
// A reconnected runtime must acknowledge the repaired generation before another repair retires it.
|
|
902
|
+
if (current.compatible && !current.stale && current.agent_revision === recoveredAgentRevision) {
|
|
903
|
+
completeRevision = recoveredAgentRevision;
|
|
904
|
+
pendingRuntimeRecovery = null; // A refused acknowledgement must re-enter native recovery.
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
let result = await sidecar.call('runtime.agent_recovery', completeRevision ? { complete_revision: completeRevision } : { probe }, { ...(signal ? { signal } : {}), timeoutMs: 660_000 });
|
|
908
|
+
if (signal?.aborted)
|
|
909
|
+
throw new Error('Agent recovery was cancelled.');
|
|
910
|
+
if (!probe && result.local_restore && result.revision)
|
|
911
|
+
recoveredAgentRevision = result.revision;
|
|
912
|
+
if (probe) {
|
|
913
|
+
if (pendingRuntimeRecovery?.fingerprint === result.fingerprint && restartBlockers().restart_blocked
|
|
914
|
+
&& (sidecar.describe?.agent_revision !== recoveredAgentRevision || !sidecar.describe?.compatible)) {
|
|
915
|
+
return { ...result, waiting_for_idle: true, detail: 'Agent recovery is waiting for active Web work to finish before refreshing its runtime.' };
|
|
916
|
+
}
|
|
917
|
+
return result;
|
|
918
|
+
}
|
|
919
|
+
if (!result.ok || (result.owed && !result.runtime_pending))
|
|
920
|
+
return result;
|
|
921
|
+
if (result.revision)
|
|
922
|
+
recoveredAgentRevision = result.revision;
|
|
923
|
+
if (result.runtime_pending)
|
|
924
|
+
pendingRuntimeRecovery = result;
|
|
925
|
+
const runtime = await sidecar.call('runtime.status', {}, { ...(signal ? { signal } : {}), timeoutMs: 5000 });
|
|
926
|
+
if (signal?.aborted)
|
|
927
|
+
throw new Error('Agent recovery was cancelled.');
|
|
928
|
+
if (recoveredAgentRevision && (runtime.agent_revision !== recoveredAgentRevision || !runtime.compatible)) {
|
|
929
|
+
if (restartBlockers().restart_blocked)
|
|
930
|
+
return { ...result, waiting_for_idle: true, detail: 'Agent recovery is waiting for active Web work to finish before refreshing its runtime.' };
|
|
931
|
+
if (['ready', 'incompatible'].includes(sidecar.status))
|
|
932
|
+
sidecar.recycle('Verified retained Agent recovery requires the current interpreter and source');
|
|
933
|
+
throw new Error('Agent services recovered; waiting for the current sidecar runtime to become ready.');
|
|
934
|
+
}
|
|
935
|
+
if (result.runtime_pending && recoveredAgentRevision)
|
|
936
|
+
result = await sidecar.call('runtime.agent_recovery', { complete_revision: recoveredAgentRevision }, { ...(signal ? { signal } : {}), timeoutMs: 660_000 });
|
|
937
|
+
if (signal?.aborted || !result.ok || result.owed)
|
|
938
|
+
throw new Error(result.detail || 'Agent recovery remains recorded until loaded readiness is verified.');
|
|
939
|
+
await sidecar.call('runtime.ensure_current', {}, { ...(signal ? { signal } : {}), timeoutMs: 5000 });
|
|
940
|
+
if (signal?.aborted)
|
|
941
|
+
throw new Error('Agent recovery was cancelled.');
|
|
942
|
+
if (!runtime.compatible || runtime.stale)
|
|
943
|
+
throw new Error('Agent recovery has no matching loaded runtime evidence; admission remains closed.');
|
|
944
|
+
catalog.invalidate(undefined, undefined, { preserveConfirmed: true });
|
|
945
|
+
recoveredAgentRevision = null;
|
|
946
|
+
pendingRuntimeRecovery = null;
|
|
947
|
+
return result;
|
|
816
948
|
},
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
949
|
+
recoveryChanged: (state) => updateNotifications.agentRecovery(state),
|
|
950
|
+
hasPendingRecovery: () => updateNotifications.hasPendingAgentRecovery(),
|
|
951
|
+
agentMutation: async (path, revision, mutate, consent) => {
|
|
952
|
+
if (!sidecar)
|
|
953
|
+
throw new Error('Hermes Agent sidecar is unavailable');
|
|
954
|
+
const begin = await sidecar.call('runtime.agent_mutation', { action: 'begin', agent_dir: path, revision, homes: agentHomes(), ...(consent?.mutationIntent ? { intent: consent.mutationIntent } : {}), ...(consent?.refreshToken ? { refresh_token: consent.refreshToken } : {}) }, {
|
|
955
|
+
timeoutMs: 330_000,
|
|
956
|
+
// TAL-1429: the lease declares its bounded native gateway drain; custody lasts that long plus the ordinary lease margin.
|
|
957
|
+
renewTimeout: (frame) => { const drain = agentDrain(frame); return drain ? drain.deadline_seconds * 1000 + 330_000 : undefined; },
|
|
958
|
+
onStream: (frame) => { const drain = agentDrain(frame); if (drain)
|
|
959
|
+
consent?.onProgress?.(gatewayDrainDetail(drain.services, drain.deadline_seconds)); },
|
|
960
|
+
});
|
|
961
|
+
if (begin.refresh_confirmation)
|
|
962
|
+
return { ok: false, refresh_confirmation: begin.refresh_confirmation, message: begin.detail };
|
|
963
|
+
if (!begin.ok || !begin.token)
|
|
964
|
+
throw new Error(begin.detail || 'Agent writer quiescence was not verified.');
|
|
965
|
+
const token = begin.token;
|
|
966
|
+
const leasedGit = async (args, cwd, timeoutMs = 10_000) => {
|
|
967
|
+
if (resolve(cwd) !== resolve(path))
|
|
968
|
+
throw new Error('Agent writer lease cannot mutate another checkout.');
|
|
969
|
+
const result = await sidecar.call('runtime.agent_mutation', { action: 'git', agent_dir: path, token, args, timeout_ms: timeoutMs }, { timeoutMs: 330_000 });
|
|
970
|
+
return { ok: result.ok, out: result.detail };
|
|
971
|
+
};
|
|
972
|
+
let result;
|
|
973
|
+
try {
|
|
974
|
+
result = await mutate(leasedGit, () => sidecar.call('runtime.agent_mutation', { action: 'sync', agent_dir: path, token }, { timeoutMs: 330_000 }));
|
|
975
|
+
}
|
|
976
|
+
catch (error) {
|
|
977
|
+
try {
|
|
978
|
+
await sidecar.call('runtime.agent_mutation', { action: 'finish', agent_dir: path, token }, { timeoutMs: 330_000 });
|
|
979
|
+
}
|
|
980
|
+
catch { /* The native pause journal retains any unverified recovery obligation. */ }
|
|
981
|
+
throw error;
|
|
982
|
+
}
|
|
983
|
+
const resumed = await sidecar.call('runtime.agent_mutation', { action: 'finish', agent_dir: path, token }, { timeoutMs: 330_000 });
|
|
984
|
+
return resumed.ok ? { ...result, ...(result.gateway_restart === 'waiting_for_idle' ? { gateway_restart: 'resumed' } : {}) }
|
|
985
|
+
: { ...result, ok: false, restart_scheduled: false, message: resumed.detail || 'Agent writer resume remains unverified; its recovery obligation is retained.' };
|
|
986
|
+
},
|
|
987
|
+
agentSync: async (agentDir) => {
|
|
820
988
|
if (!sidecar)
|
|
821
989
|
throw new Error('Hermes Agent sidecar is unavailable');
|
|
822
|
-
return sidecar.call('
|
|
990
|
+
return sidecar.call('runtime.sync_dependencies', { agent_dir: agentDir }, { timeoutMs: 330_000 });
|
|
991
|
+
},
|
|
992
|
+
channel: () => normalizeChannel(settings.peek().update_channel),
|
|
993
|
+
agentChannel: () => normalizeChannel(settings.peek().agent_update_channel),
|
|
994
|
+
includeAgent: () => !pyBool(settings.peek().ignore_agent_updates),
|
|
995
|
+
summarizeAutomatically: () => settings.peek().check_for_updates !== false && settings.peek().summarize_updates_automatically !== false,
|
|
996
|
+
autoApply: () => settings.peek().check_for_updates !== false && settings.peek().auto_apply_updates === true,
|
|
997
|
+
checkEnabled: () => !truthy(env.HERMES_WEBUI_TEST_NETWORK_BLOCK) && settings.peek().check_for_updates !== false,
|
|
998
|
+
autoNotification: {
|
|
999
|
+
begin: async () => (await updateNotifications.begin({ owner: '*', profile: 'default', serverOwner: true }, 'webui')).id,
|
|
1000
|
+
transition: async (id, phase, expectedIdentity, verifiedIdentity, detail) => { (await updateNotifications.transition(id, phase, expectedIdentity, verifiedIdentity, detail)); },
|
|
823
1001
|
},
|
|
1002
|
+
blockers: restartBlockers,
|
|
1003
|
+
scheduleRestart: () => { setTimeout(() => { void waitUntilRestartSafe(restartBlockers, { maxWaitMs: Infinity, log }).then(() => { deps.requestRestart(); }); }, 2000).unref(); },
|
|
1004
|
+
gatewayRestarting: () => deps.gatewayRestarts.restarting(),
|
|
824
1005
|
llm: async (system, user) => {
|
|
825
1006
|
if (!sidecar)
|
|
826
1007
|
return '';
|
|
@@ -829,6 +1010,26 @@ export function createDeps(opts) {
|
|
|
829
1010
|
},
|
|
830
1011
|
log,
|
|
831
1012
|
});
|
|
1013
|
+
deps.gatewayRestarts = new GatewayRestartQueue({
|
|
1014
|
+
notifications: updateNotifications,
|
|
1015
|
+
blockers: (profile) => gatewayRestartBlockers(config.hermesHome, profileHome(profile), now()),
|
|
1016
|
+
updating: () => deps.updates.blocksNewWork(),
|
|
1017
|
+
restart: async (profile, interrupt) => {
|
|
1018
|
+
if (!sidecar)
|
|
1019
|
+
throw new Error('Hermes Agent sidecar is unavailable');
|
|
1020
|
+
return restartGateway(sidecar, profileHome(profile), interrupt);
|
|
1021
|
+
},
|
|
1022
|
+
gateways: (profile) => liveGateways(config.hermesHome, profileHome(profile), now()),
|
|
1023
|
+
runtimeReady: async () => {
|
|
1024
|
+
if (!sidecar)
|
|
1025
|
+
return false;
|
|
1026
|
+
const runtime = await sidecar.call('runtime.status', {}, { timeoutMs: 5000 });
|
|
1027
|
+
return runtime.compatible && !runtime.stale;
|
|
1028
|
+
},
|
|
1029
|
+
log,
|
|
1030
|
+
});
|
|
1031
|
+
// TAL-1254: every (re)started sidecar owns the worktree chats' locks before it reports ready, so the Agent's sweep keeps them.
|
|
1032
|
+
await sidecar?.addReadyGate?.((call) => sessions.retainWorktrees(call));
|
|
832
1033
|
return deps;
|
|
833
1034
|
}
|
|
834
1035
|
/** Python `_read_active_profile_file`: the sticky profile name, or `default` when absent, unreadable, or malformed. */
|
|
@@ -841,4 +1042,10 @@ function readActiveProfileFile(hermesHome, pattern) {
|
|
|
841
1042
|
return 'default';
|
|
842
1043
|
}
|
|
843
1044
|
}
|
|
1045
|
+
export function createStorage(config, now = () => Date.now() / 1000, profileHome = (name) => name === 'default' ? config.hermesHome : join(config.hermesHome, 'profiles', name)) {
|
|
1046
|
+
if (config.storage !== 'json')
|
|
1047
|
+
throw new Error(`Unknown TALARIA_STORAGE=${JSON.stringify(config.storage)}; supported backends: json`);
|
|
1048
|
+
const storage = new JsonStorage({ directory: config.sessionDir, stateDir: config.stateDir, profileHome, env: config.env, now, stampingSince: async () => (await recoveryStampingSince(storage.documents)) });
|
|
1049
|
+
return storage;
|
|
1050
|
+
}
|
|
844
1051
|
//# sourceMappingURL=runtime.js.map
|