@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
|
@@ -2,8 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import contextlib
|
|
6
|
+
import hashlib
|
|
7
|
+
import importlib.util
|
|
8
|
+
import json
|
|
5
9
|
import logging
|
|
10
|
+
import os
|
|
11
|
+
import pathlib
|
|
12
|
+
import secrets
|
|
6
13
|
import threading
|
|
14
|
+
import time
|
|
7
15
|
from typing import Any
|
|
8
16
|
|
|
9
17
|
from ..errors import InvalidParams, RpcError
|
|
@@ -22,13 +30,21 @@ _RUNTIME_COMMANDS = {
|
|
|
22
30
|
"codex-runtime": ("Toggle codex app-server runtime for OpenAI/Codex models", "Configuration", "[auto|codex_app_server]"),
|
|
23
31
|
"credits": ("Show your Nous credits", "Info", ""),
|
|
24
32
|
}
|
|
25
|
-
|
|
33
|
+
# Commands ``commands.exec`` runs through the Agent's registry executor (``hermes_cli.slash_exec``), so the reply is the
|
|
34
|
+
# Agent's own; an Agent whose registry lacks one neither lists nor runs it.
|
|
35
|
+
_REGISTRY_EXECUTED = frozenset({"autoprune"})
|
|
36
|
+
_ALLOWED = frozenset(_RUNTIME_COMMANDS) | _REGISTRY_EXECUTED
|
|
26
37
|
_RELOAD_MCP_LOCK = threading.Lock()
|
|
27
38
|
_RELOAD_SKILLS_LOCK = threading.Lock()
|
|
28
39
|
_CODEX_RUNTIME_LOCK = threading.Lock()
|
|
40
|
+
_MCP_DISCOVERED_HOMES: set[str] = set()
|
|
41
|
+
_MCP_DISCOVERED_LOCK = threading.Lock()
|
|
42
|
+
_PLUGIN_UPDATE_CONSENTS: dict[str, dict] = {}
|
|
43
|
+
_PLUGIN_UPDATE_CONSENT_LOCK = threading.Lock()
|
|
29
44
|
|
|
30
45
|
|
|
31
|
-
def
|
|
46
|
+
def _split_slash_command(command: str) -> tuple[str, str]:
|
|
47
|
+
"""The command name as typed (lowercase, no slash) and its raw arguments."""
|
|
32
48
|
raw = str(command or "").strip()
|
|
33
49
|
if not raw:
|
|
34
50
|
raise InvalidParams("command is required")
|
|
@@ -37,7 +53,111 @@ def parse_slash_command(command: str) -> tuple[str, str]:
|
|
|
37
53
|
base = (parts[0] if parts else "").strip().lower()
|
|
38
54
|
if not base:
|
|
39
55
|
raise InvalidParams("command is required")
|
|
40
|
-
return
|
|
56
|
+
return base, parts[1] if len(parts) > 1 else ""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def parse_slash_command(command: str) -> tuple[str, str]:
|
|
60
|
+
base, args = _split_slash_command(command)
|
|
61
|
+
return _ALIASES.get(base, base), args
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _expand_plan(args: str, **_turn) -> str:
|
|
65
|
+
from agent.plan_prompt import build_plan_prompt
|
|
66
|
+
|
|
67
|
+
return build_plan_prompt(args)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _expand_learn(args: str, **_turn) -> str:
|
|
71
|
+
from agent.learn_prompt import build_learn_prompt
|
|
72
|
+
|
|
73
|
+
return build_learn_prompt(args)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _expand_init(args: str, *, workspace: str, **_turn) -> str:
|
|
77
|
+
from hermes_cli.init_command import build_init_prompt_for_cwd
|
|
78
|
+
|
|
79
|
+
# The Agent falls back to the process cwd for a missing directory; the sidecar's is never the user's project.
|
|
80
|
+
if not workspace or not os.path.isdir(workspace):
|
|
81
|
+
raise InvalidParams("workspace is not a directory")
|
|
82
|
+
return build_init_prompt_for_cwd(cwd=workspace, extra=args)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _expand_initiate_setup(_args: str, *, enabled_toolsets, **_turn) -> str:
|
|
86
|
+
from agent.initiate_setup_prompt import build_initiate_setup_prompt
|
|
87
|
+
from hermes_cli.setup_profile import primary_profile
|
|
88
|
+
from hermes_constants import get_hermes_home
|
|
89
|
+
from model_tools import get_tool_definitions
|
|
90
|
+
|
|
91
|
+
from .chat import _turn_toolsets
|
|
92
|
+
from .toolsets import disabled_toolsets
|
|
93
|
+
|
|
94
|
+
# The gateway's ``_hm_cmd_initiate_setup``: the tools this turn's agent gets, by name. MCP servers connect first, as
|
|
95
|
+
# chat start connects them before its agent snapshots tools; a failure leaves them out, as it does for the turn.
|
|
96
|
+
try:
|
|
97
|
+
discover_profile_mcp_tools()
|
|
98
|
+
except Exception: # noqa: BLE001
|
|
99
|
+
log.warning("MCP discovery failed", exc_info=True)
|
|
100
|
+
tools = get_tool_definitions(enabled_toolsets=_turn_toolsets(enabled_toolsets), disabled_toolsets=disabled_toolsets(),
|
|
101
|
+
quiet_mode=True, skip_tool_search_assembly=True)
|
|
102
|
+
return build_initiate_setup_prompt("webui", [tool["function"]["name"] for tool in tools], primary_profile(get_hermes_home()))
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# The Agent built-ins every surface answers by rewriting the turn to a builder's prompt (the gateway's
|
|
106
|
+
# ``_hm_rewrite_turn_to_prompt``), with the Agent module each expander needs. ``None``: no expander yet, so no client
|
|
107
|
+
# offers it (``/blueprint`` seeds a turn only after its own slot parsing and job wiring).
|
|
108
|
+
_PROMPT_BUILTINS: dict[str, tuple[Any, str] | None] = {
|
|
109
|
+
"plan": (_expand_plan, "agent.plan_prompt"),
|
|
110
|
+
"learn": (_expand_learn, "agent.learn_prompt"),
|
|
111
|
+
"init": (_expand_init, "hermes_cli.init_command"),
|
|
112
|
+
"initiate-setup": (_expand_initiate_setup, "agent.initiate_setup_prompt"),
|
|
113
|
+
"blueprint": None,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _prompt_expander(name: str):
|
|
118
|
+
"""The expander for a prompt built-in this Agent ships the builder for; None when it has none."""
|
|
119
|
+
entry = _PROMPT_BUILTINS.get(name)
|
|
120
|
+
if entry is None:
|
|
121
|
+
return None
|
|
122
|
+
try:
|
|
123
|
+
found = importlib.util.find_spec(entry[1]) is not None
|
|
124
|
+
except (ImportError, ValueError):
|
|
125
|
+
found = False
|
|
126
|
+
return entry[0] if found else None
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _prompt_mode(name: str) -> str | None:
|
|
130
|
+
if name not in _PROMPT_BUILTINS:
|
|
131
|
+
return None
|
|
132
|
+
return "expand" if _prompt_expander(name) else "unsupported"
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def expand_prompt(command: str, workspace: str, enabled_toolsets, session_id: str = "") -> dict[str, Any]:
|
|
136
|
+
"""``/<prompt built-in> [args]`` as the turn text the Agent's own builder writes. ``name`` is the built-in's (None
|
|
137
|
+
when the command is not one) and ``message`` None when this Agent has no builder for it."""
|
|
138
|
+
try:
|
|
139
|
+
name, args = parse_slash_command(command)
|
|
140
|
+
from hermes_cli.commands import resolve_command
|
|
141
|
+
except (InvalidParams, ImportError):
|
|
142
|
+
return {"name": None, "message": None}
|
|
143
|
+
cmd = resolve_command(name)
|
|
144
|
+
if cmd is None or cmd.name not in _PROMPT_BUILTINS:
|
|
145
|
+
return {"name": None, "message": None}
|
|
146
|
+
# TAL-1279: as the CLI does, before it expands or refuses the built-in.
|
|
147
|
+
_fire_pre_command(command, session_id, cmd.name, workspace)
|
|
148
|
+
expander = _prompt_expander(cmd.name)
|
|
149
|
+
if expander is None:
|
|
150
|
+
return {"name": cmd.name, "message": None}
|
|
151
|
+
try:
|
|
152
|
+
message = str(expander(args, workspace=workspace, enabled_toolsets=enabled_toolsets) or "").strip()
|
|
153
|
+
except InvalidParams:
|
|
154
|
+
raise
|
|
155
|
+
except Exception as exc: # noqa: BLE001
|
|
156
|
+
log.warning("Failed to expand /%s", cmd.name, exc_info=True)
|
|
157
|
+
raise RpcError(f"Couldn't start /{cmd.name}", condition="prompt_expand_failed") from exc
|
|
158
|
+
if not message:
|
|
159
|
+
raise RpcError(f"Couldn't start /{cmd.name}", condition="prompt_expand_failed")
|
|
160
|
+
return {"name": cmd.name, "message": message}
|
|
41
161
|
|
|
42
162
|
|
|
43
163
|
def list_commands() -> list[dict[str, Any]]:
|
|
@@ -53,13 +173,13 @@ def list_commands() -> list[dict[str, Any]]:
|
|
|
53
173
|
out.append({
|
|
54
174
|
"name": cmd.name, "description": cmd.description, "category": cmd.category, "aliases": list(cmd.aliases),
|
|
55
175
|
"args_hint": cmd.args_hint, "subcommands": list(cmd.subcommands), "cli_only": bool(cmd.cli_only), "gateway_only": bool(cmd.gateway_only),
|
|
56
|
-
"exec": cmd.name in _ALLOWED,
|
|
176
|
+
"exec": cmd.name in _ALLOWED, "prompt": _prompt_mode(cmd.name),
|
|
57
177
|
})
|
|
58
178
|
listed = {c["name"] for c in out}
|
|
59
179
|
for name, (description, category, args_hint) in _RUNTIME_COMMANDS.items():
|
|
60
180
|
if name not in listed:
|
|
61
181
|
out.append({"name": name, "description": description, "category": category, "aliases": [a for a, n in _ALIASES.items() if n == name],
|
|
62
|
-
"args_hint": args_hint, "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True})
|
|
182
|
+
"args_hint": args_hint, "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True, "prompt": None})
|
|
63
183
|
try:
|
|
64
184
|
from hermes_cli.plugins import get_plugin_commands
|
|
65
185
|
|
|
@@ -68,7 +188,7 @@ def list_commands() -> list[dict[str, Any]]:
|
|
|
68
188
|
if name in existing or name in _NEVER_EXPOSE:
|
|
69
189
|
continue
|
|
70
190
|
out.append({"name": name, "description": str(info.get("description", "Plugin command")), "category": "Plugin", "aliases": [],
|
|
71
|
-
"args_hint": str(info.get("args_hint", "")), "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True})
|
|
191
|
+
"args_hint": str(info.get("args_hint", "")), "subcommands": [], "cli_only": False, "gateway_only": False, "exec": True, "prompt": None})
|
|
72
192
|
except Exception: # noqa: BLE001 - plugin registry is optional
|
|
73
193
|
log.debug("plugin command listing failed", exc_info=True)
|
|
74
194
|
return out
|
|
@@ -95,15 +215,42 @@ def retire_unscoped_launch_mcp_servers() -> set[str]:
|
|
|
95
215
|
return names
|
|
96
216
|
|
|
97
217
|
|
|
218
|
+
def discover_profile_mcp_tools() -> list[str]:
|
|
219
|
+
"""Connect this profile's configured servers, retiring pre-multiplex launch connections first."""
|
|
220
|
+
from hermes_constants import get_hermes_home
|
|
221
|
+
from tools.mcp_tool_discovery import discover_mcp_tools
|
|
222
|
+
|
|
223
|
+
retire_unscoped_launch_mcp_servers()
|
|
224
|
+
tools = discover_mcp_tools()
|
|
225
|
+
with _MCP_DISCOVERED_LOCK:
|
|
226
|
+
_MCP_DISCOVERED_HOMES.add(os.path.realpath(get_hermes_home()))
|
|
227
|
+
return tools
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def profile_mcp_tools_discovered(home) -> bool:
|
|
231
|
+
"""A completed discovery, including an empty registry, establishes this process's profile baseline."""
|
|
232
|
+
with _MCP_DISCOVERED_LOCK:
|
|
233
|
+
return os.path.realpath(home) in _MCP_DISCOVERED_HOMES
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def forget_profile_mcp_tools(home) -> None:
|
|
237
|
+
"""A successfully deleted profile must start cold if its path is recreated."""
|
|
238
|
+
with _MCP_DISCOVERED_LOCK:
|
|
239
|
+
_MCP_DISCOVERED_HOMES.discard(os.path.realpath(home))
|
|
240
|
+
|
|
241
|
+
|
|
98
242
|
def _reload_mcp() -> str:
|
|
99
243
|
with _RELOAD_MCP_LOCK:
|
|
100
244
|
try:
|
|
101
245
|
from agent.secret_scope import is_multiplex_active
|
|
246
|
+
from hermes_constants import get_hermes_home
|
|
102
247
|
from tools.mcp_tool import _lock, _mcp_tool_server_names, _server_visible_in_scope, _servers
|
|
103
|
-
from tools.
|
|
248
|
+
from tools.mcp_tool_agent import reprobe_tool_availability
|
|
104
249
|
from tools.mcp_tool_lifecycle import shutdown_mcp_servers
|
|
105
250
|
from tools.mcp_tool_scope import _key_name
|
|
106
251
|
from tools.registry import registry
|
|
252
|
+
|
|
253
|
+
from .chat import refresh_profile_agents_mcp_tools
|
|
107
254
|
except Exception as exc: # noqa: BLE001
|
|
108
255
|
raise RpcError("MCP runtime unavailable", condition="mcp_unavailable") from exc
|
|
109
256
|
# Like the gateway's ``_execute_mcp_reload``: under multiplexing only this profile's connections go down and
|
|
@@ -117,7 +264,11 @@ def _reload_mcp() -> str:
|
|
|
117
264
|
try:
|
|
118
265
|
old = server_names() | retire_unscoped_launch_mcp_servers()
|
|
119
266
|
shutdown_mcp_servers(scope=scope)
|
|
120
|
-
|
|
267
|
+
# As the gateway does: drop the cached tool availability verdicts, then hand the profile's open chats the
|
|
268
|
+
# rediscovered tools.
|
|
269
|
+
reprobe_tool_availability()
|
|
270
|
+
tools = discover_profile_mcp_tools() or []
|
|
271
|
+
refresh_profile_agents_mcp_tools(get_hermes_home())
|
|
121
272
|
connected = server_names()
|
|
122
273
|
if scope is not None:
|
|
123
274
|
with _lock:
|
|
@@ -210,11 +361,43 @@ def _credits() -> str:
|
|
|
210
361
|
return "\n".join(lines)
|
|
211
362
|
|
|
212
363
|
|
|
213
|
-
def
|
|
364
|
+
def _fire_pre_command(command: str, session_id: str, canonical: str | None = None, workspace: str = "") -> None:
|
|
365
|
+
"""The Agent's observer-only ``pre_command`` hook, which every local surface fires before a recognised command runs.
|
|
366
|
+
A chat's observers run under that chat's session and workspace, as its plugin commands and turns do."""
|
|
367
|
+
from hermes_cli.plugins import fire_pre_command_hook
|
|
368
|
+
|
|
369
|
+
from .chat import _turn_identity
|
|
370
|
+
|
|
371
|
+
typed, arg = _split_slash_command(command)
|
|
372
|
+
with _turn_identity(session_id, workspace) if session_id else contextlib.nullcontext():
|
|
373
|
+
fire_pre_command_hook(surface="webui", command=canonical or _ALIASES.get(typed, typed), alias_used=typed, args_raw=arg,
|
|
374
|
+
session_key=session_id or None, platform="webui")
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def _registry_executor(name: str):
|
|
378
|
+
"""The Agent registry's shared executor for ``name``; None when this Agent has none."""
|
|
379
|
+
try:
|
|
380
|
+
from hermes_cli.commands import resolve_command
|
|
381
|
+
from hermes_cli.slash_exec import resolve_executor
|
|
382
|
+
except ImportError:
|
|
383
|
+
return None
|
|
384
|
+
cmd = resolve_command(name)
|
|
385
|
+
return resolve_executor(cmd) if cmd is not None else None
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def execute_agent_command(command: str, session_id: str = "", workspace: str = "") -> str | None:
|
|
214
389
|
"""Run one of the allowlisted agent-side runtime commands; None when not one."""
|
|
215
390
|
canonical, arg_string = parse_slash_command(command)
|
|
216
391
|
if canonical not in _ALLOWED:
|
|
217
392
|
return None
|
|
393
|
+
executor = _registry_executor(canonical) if canonical in _REGISTRY_EXECUTED else None
|
|
394
|
+
if canonical in _REGISTRY_EXECUTED and executor is None:
|
|
395
|
+
return None
|
|
396
|
+
_fire_pre_command(command, session_id, workspace=workspace)
|
|
397
|
+
if executor is not None:
|
|
398
|
+
from hermes_cli.slash_exec import CommandContext
|
|
399
|
+
|
|
400
|
+
return str(executor(CommandContext(surface="webui", args=arg_string)).text or "(no output)")
|
|
218
401
|
if canonical == "reload-mcp":
|
|
219
402
|
return _reload_mcp()
|
|
220
403
|
if canonical == "reload-skills":
|
|
@@ -224,7 +407,16 @@ def execute_agent_command(command: str) -> str | None:
|
|
|
224
407
|
return _credits()
|
|
225
408
|
|
|
226
409
|
|
|
227
|
-
def
|
|
410
|
+
def _invoke_plugin_handler(handler, arg: str, session_id: str):
|
|
411
|
+
"""``handler(arg)`` plus the session context it declares, as every Agent surface calls it (v0.22.3+)."""
|
|
412
|
+
try:
|
|
413
|
+
from hermes_cli.plugin_command_dispatch import invoke_plugin_command
|
|
414
|
+
except ImportError: # Delete this fallback once v0.22.3 is the oldest supported Agent.
|
|
415
|
+
return handler(arg)
|
|
416
|
+
return invoke_plugin_command(handler, arg, source=None, session_id=session_id, session_key=session_id, platform="webui")
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def execute_plugin_command(command: str, session_id: str = "") -> str | None:
|
|
228
420
|
"""Run a plugin-registered slash command; None when no plugin owns it."""
|
|
229
421
|
base, arg = parse_slash_command(command)
|
|
230
422
|
try:
|
|
@@ -237,8 +429,9 @@ def execute_plugin_command(command: str) -> str | None:
|
|
|
237
429
|
raise RpcError("plugin command lookup failed", condition="plugins_unavailable") from exc
|
|
238
430
|
if not handler:
|
|
239
431
|
return None
|
|
432
|
+
_fire_pre_command(command, session_id)
|
|
240
433
|
try:
|
|
241
|
-
return str(resolve_plugin_command_result(handler
|
|
434
|
+
return str(resolve_plugin_command_result(_invoke_plugin_handler(handler, arg, session_id)) or "(no output)")
|
|
242
435
|
except Exception as exc: # noqa: BLE001 - user-facing text, never a transport error
|
|
243
436
|
log.warning("Plugin command %r execution failed", base, exc_info=True)
|
|
244
437
|
return f"Plugin command error: {type(exc).__name__}"
|
|
@@ -360,6 +553,103 @@ def _clean_text(value, limit: int = 240) -> str:
|
|
|
360
553
|
return text[: limit - 1].rstrip() + "…" if len(text) > limit else text
|
|
361
554
|
|
|
362
555
|
|
|
556
|
+
def _plugin_update_modules():
|
|
557
|
+
try:
|
|
558
|
+
from hermes_cli import plugins_cmd, plugins_transaction
|
|
559
|
+
from hermes_cli.plugins_cadence import cached_git_updates
|
|
560
|
+
except ImportError:
|
|
561
|
+
return None
|
|
562
|
+
return plugins_cmd, plugins_transaction, cached_git_updates
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
def update_plugin(key: str, accept_caution: bool, consent_token: str | None = None) -> dict:
|
|
566
|
+
"""The Agent owns Git staging, scan consent and publication, under the caller's profile scope."""
|
|
567
|
+
if not key or not isinstance(accept_caution, bool) or (consent_token is not None and not isinstance(consent_token, str)):
|
|
568
|
+
raise InvalidParams("plugins.update requires a key and boolean accept_caution")
|
|
569
|
+
modules = _plugin_update_modules()
|
|
570
|
+
if modules is None:
|
|
571
|
+
raise RpcError("This Hermes Agent cannot update plugins from Web", condition="plugin_update_unsupported")
|
|
572
|
+
pc, transaction, _cached = modules
|
|
573
|
+
found = pc._find_plugin_entry(key)
|
|
574
|
+
if found is None or not found[4]:
|
|
575
|
+
raise RpcError(f"plugin {key!r} not found", condition="plugin_not_found")
|
|
576
|
+
from hermes_constants import get_hermes_home
|
|
577
|
+
target = pathlib.Path(str(found[4])).resolve()
|
|
578
|
+
# Only profile-owned installs, never bundled, project or entrypoint plugins.
|
|
579
|
+
if target.parent != (get_hermes_home() / "plugins").resolve():
|
|
580
|
+
raise InvalidParams("Only profile-installed Git plugins can be updated")
|
|
581
|
+
from pm.store import tree_digest
|
|
582
|
+
from tools.plugin_guard import format_scan_report
|
|
583
|
+
|
|
584
|
+
def installed_identity():
|
|
585
|
+
return (str(get_hermes_home().resolve()), str(target.resolve()), found[5], tree_digest(target),
|
|
586
|
+
json.dumps(pc._read_install_metadata().get(target.name, {}), sort_keys=True))
|
|
587
|
+
|
|
588
|
+
identity = installed_identity()
|
|
589
|
+
with _PLUGIN_UPDATE_CONSENT_LOCK:
|
|
590
|
+
now = time.monotonic()
|
|
591
|
+
for token, receipt in list(_PLUGIN_UPDATE_CONSENTS.items()):
|
|
592
|
+
if receipt["expires"] <= now:
|
|
593
|
+
_PLUGIN_UPDATE_CONSENTS.pop(token)
|
|
594
|
+
consent = _PLUGIN_UPDATE_CONSENTS.pop(consent_token, None) if accept_caution and consent_token else None
|
|
595
|
+
if accept_caution and consent_token and (consent is None or consent["identity"] != identity):
|
|
596
|
+
raise RpcError("Plugin update confirmation expired or the installation changed; update again to review its scan",
|
|
597
|
+
condition="plugin_update_consent_changed")
|
|
598
|
+
|
|
599
|
+
revision = ""
|
|
600
|
+
consent_changed = False
|
|
601
|
+
changed_message = "The plugin installation or revision changed; update again to review its scan"
|
|
602
|
+
|
|
603
|
+
# The Agent staging hook exposes the candidate commit before its scan and publication gates.
|
|
604
|
+
def capture_revision(staged):
|
|
605
|
+
nonlocal revision, consent_changed
|
|
606
|
+
if not staged.resolve().is_relative_to(target.parent) or installed_identity() != identity:
|
|
607
|
+
consent_changed = True
|
|
608
|
+
raise pc.PluginOperationError(changed_message)
|
|
609
|
+
revision = pc._git_head_revision(staged, pc._resolve_git_executable())
|
|
610
|
+
if consent and consent["revision"] != revision:
|
|
611
|
+
consent_changed = True
|
|
612
|
+
raise pc.PluginOperationError(changed_message)
|
|
613
|
+
return []
|
|
614
|
+
|
|
615
|
+
def scan_binding(scan):
|
|
616
|
+
payload = json.dumps([format_scan_report(scan), getattr(scan, "scan_provenance", {}),
|
|
617
|
+
[vars(finding) for finding in getattr(scan, "findings", [])]], sort_keys=True)
|
|
618
|
+
return hashlib.sha256(payload.encode()).hexdigest()
|
|
619
|
+
|
|
620
|
+
def accept_scan(scan):
|
|
621
|
+
nonlocal consent_changed
|
|
622
|
+
if installed_identity() != identity:
|
|
623
|
+
consent_changed = True
|
|
624
|
+
return False
|
|
625
|
+
return consent is not None and consent["revision"] == revision and consent["scan"] == scan_binding(scan)
|
|
626
|
+
|
|
627
|
+
try:
|
|
628
|
+
# A blanket force would bypass the callback: only the exact scanned identity can accept caution.
|
|
629
|
+
transaction.update_plugin(target, force=False, scan_decision_cb=accept_scan, carry_user_files=capture_revision)
|
|
630
|
+
except pc.PluginScanBlocked as exc:
|
|
631
|
+
if consent_changed:
|
|
632
|
+
raise RpcError(changed_message, condition="plugin_update_consent_changed") from exc
|
|
633
|
+
scan = exc.scan_result
|
|
634
|
+
verdict = getattr(scan, "verdict", "dangerous")
|
|
635
|
+
result = {"key": found[5], "status": "needs_consent" if verdict == "caution" else "blocked",
|
|
636
|
+
"verdict": verdict, "findings": str(exc)}
|
|
637
|
+
if verdict == "caution":
|
|
638
|
+
token = secrets.token_urlsafe(32)
|
|
639
|
+
with _PLUGIN_UPDATE_CONSENT_LOCK:
|
|
640
|
+
if len(_PLUGIN_UPDATE_CONSENTS) >= 64:
|
|
641
|
+
_PLUGIN_UPDATE_CONSENTS.pop(next(iter(_PLUGIN_UPDATE_CONSENTS)))
|
|
642
|
+
_PLUGIN_UPDATE_CONSENTS[token] = {"identity": identity, "revision": revision, "scan": scan_binding(scan),
|
|
643
|
+
"expires": time.monotonic() + 300}
|
|
644
|
+
result["consent_token"] = token
|
|
645
|
+
return result
|
|
646
|
+
except pc.PluginOperationError as exc:
|
|
647
|
+
raise RpcError(str(exc), condition="plugin_update_consent_changed" if consent_changed else "plugin_update_refused") from exc
|
|
648
|
+
from hermes_cli.plugins import discover_plugins
|
|
649
|
+
discover_plugins(force=True)
|
|
650
|
+
return {"key": found[5], "status": "updated"}
|
|
651
|
+
|
|
652
|
+
|
|
363
653
|
def plugin_visibility(selected_providers: dict) -> dict:
|
|
364
654
|
"""Sanitized plugin/hook rows for Settings (Python ``_plugin_visibility_payload``); no paths or callbacks."""
|
|
365
655
|
try:
|
|
@@ -369,6 +659,12 @@ def plugin_visibility(selected_providers: dict) -> dict:
|
|
|
369
659
|
manager.discover_and_load(force=False)
|
|
370
660
|
except Exception as exc: # noqa: BLE001
|
|
371
661
|
raise RpcError(f"plugin manager unavailable: {exc}", condition="plugins_unavailable") from exc
|
|
662
|
+
modules = _plugin_update_modules()
|
|
663
|
+
updates = None
|
|
664
|
+
if modules:
|
|
665
|
+
from hermes_cli.plugins_provenance import read_sidecar_rows
|
|
666
|
+
from hermes_constants import get_hermes_home
|
|
667
|
+
updates = modules[2](read_sidecar_rows(get_hermes_home() / "plugins"))
|
|
372
668
|
rows = []
|
|
373
669
|
for key, loaded in sorted((getattr(manager, "_plugins", {}) or {}).items(), key=lambda item: str(item[0])):
|
|
374
670
|
manifest = getattr(loaded, "manifest", None)
|
|
@@ -400,10 +696,141 @@ def plugin_visibility(selected_providers: dict) -> dict:
|
|
|
400
696
|
row["is_active_provider"] = bool(selected) and slug == selected
|
|
401
697
|
else:
|
|
402
698
|
row["is_active_provider"] = kind == "model-provider" and enabled
|
|
699
|
+
if updates is not None:
|
|
700
|
+
installed = pathlib.Path(str(getattr(manifest, "path", "") or "")).resolve()
|
|
701
|
+
owned = installed.parent == (get_hermes_home() / "plugins").resolve() and (installed / ".git").is_dir()
|
|
702
|
+
revision = updates.get(installed.name) if owned else None
|
|
703
|
+
row["update_available"] = bool(revision)
|
|
704
|
+
if revision:
|
|
705
|
+
row["latest_revision"] = revision
|
|
403
706
|
rows.append(row)
|
|
404
707
|
return {"plugins": rows, "supported_hooks": list(PLUGIN_VISIBILITY_HOOKS)}
|
|
405
708
|
|
|
406
709
|
|
|
710
|
+
def isolation_survey(base_home: pathlib.Path) -> list[dict]:
|
|
711
|
+
"""Each profile's ``plugins.isolation`` and installed third-party plugin count, read from disk without loading a plugin."""
|
|
712
|
+
from hermes_cli.plugin_isolation import isolation_mode
|
|
713
|
+
from hermes_cli.plugins_cmd import _scan_level
|
|
714
|
+
|
|
715
|
+
from .profiles import _yaml_load, named_profile_homes
|
|
716
|
+
|
|
717
|
+
rows = []
|
|
718
|
+
for name, home in [("default", base_home), *named_profile_homes(base_home)]:
|
|
719
|
+
seen: dict = {}
|
|
720
|
+
_scan_level(home / "plugins", "user", set(), "", 0, seen)
|
|
721
|
+
rows.append({"name": name, "isolation": isolation_mode(_yaml_load(home / "config.yaml") or {}), "third_party_plugins": len(seen)})
|
|
722
|
+
return rows
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
def _plugin_settings_modules():
|
|
726
|
+
"""The Agent's manifest ``config_schema`` reader/writer (v0.21.6+) and its plugin resolver; ``None`` on older Agents."""
|
|
727
|
+
try:
|
|
728
|
+
import hermes_cli.plugins_cmd as plugins_cmd
|
|
729
|
+
import hermes_cli.plugins_settings as plugins_settings
|
|
730
|
+
except ImportError:
|
|
731
|
+
return None
|
|
732
|
+
return plugins_cmd, plugins_settings
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
def plugin_settings() -> dict:
|
|
736
|
+
"""Every discovered plugin whose manifest declares settings, with its fields (secrets as ``env`` + ``has_value`` only)."""
|
|
737
|
+
modules = _plugin_settings_modules()
|
|
738
|
+
if modules is None:
|
|
739
|
+
return {"supported": False, "plugins": []}
|
|
740
|
+
plugins_cmd, plugins_settings = modules
|
|
741
|
+
rows = []
|
|
742
|
+
for _name, _version, _desc, _source, plugin_dir, key in plugins_cmd._discover_all_plugins():
|
|
743
|
+
fields = plugins_settings.plugin_settings_fields(key, pathlib.Path(str(plugin_dir)) if plugin_dir else None)
|
|
744
|
+
if fields:
|
|
745
|
+
rows.append({"key": key, "fields": fields})
|
|
746
|
+
return {"supported": True, "plugins": rows}
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
def _apply_plugin_mcp_settings(plugins_cmd, plugin_dir, key: str) -> str:
|
|
750
|
+
"""Reconcile package-owned launch inputs on the RPC worker, preserving the request's profile scope."""
|
|
751
|
+
try:
|
|
752
|
+
if not plugin_dir or not plugins_cmd._is_portable_plugin_dir(plugin_dir):
|
|
753
|
+
return "applied"
|
|
754
|
+
from hermes_cli.agent_plugins import load_agent_plugin
|
|
755
|
+
from hermes_cli.plugins_manifest import portable_mcp_server_name
|
|
756
|
+
|
|
757
|
+
package = load_agent_plugin(plugin_dir, plugin_dir)
|
|
758
|
+
if any(d.scope == "mcp" or d.scope.startswith("mcp:") for d in package.diagnostics):
|
|
759
|
+
return "unknown"
|
|
760
|
+
names = {portable_mcp_server_name(key, server) for server in package.mcp_servers}
|
|
761
|
+
if not names:
|
|
762
|
+
return "applied"
|
|
763
|
+
from hermes_cli.config import load_config_readonly
|
|
764
|
+
from hermes_cli.plugins import get_plugin_manager
|
|
765
|
+
|
|
766
|
+
manager = get_plugin_manager()
|
|
767
|
+
manager.discover_and_load(force=False)
|
|
768
|
+
owners = getattr(manager, "_portable_mcp_server_plugins", None)
|
|
769
|
+
if owners is None:
|
|
770
|
+
return "restart_required"
|
|
771
|
+
native = (load_config_readonly() or {}).get("mcp_servers") or {}
|
|
772
|
+
names = {name for name in names if owners.get(name) == key and name not in native}
|
|
773
|
+
if not names:
|
|
774
|
+
return "applied"
|
|
775
|
+
from tools import mcp_tool_discovery as discovery
|
|
776
|
+
|
|
777
|
+
reconnect = getattr(discovery, "restart_mcp_servers_with_new_inputs", None)
|
|
778
|
+
if reconnect is None:
|
|
779
|
+
return "restart_required"
|
|
780
|
+
# Also exclude the explicit Reload MCP path. The native helper serializes settings-driven reconnects.
|
|
781
|
+
with _RELOAD_MCP_LOCK:
|
|
782
|
+
live = {row["name"] for row in discovery.get_mcp_status() if row["name"] in names and row.get("connected")}
|
|
783
|
+
restarted = reconnect(names)
|
|
784
|
+
if restarted:
|
|
785
|
+
from hermes_constants import get_hermes_home
|
|
786
|
+
|
|
787
|
+
from .chat import refresh_profile_agents_mcp_tools
|
|
788
|
+
|
|
789
|
+
refresh_profile_agents_mcp_tools(get_hermes_home())
|
|
790
|
+
statuses = {row["name"]: row["status"] for row in discovery.get_mcp_status() if row["name"] in names}
|
|
791
|
+
if any(status == "failed" for status in statuses.values()):
|
|
792
|
+
return "restart_required"
|
|
793
|
+
if any(status == "connecting" for status in statuses.values()) or any(name not in statuses for name in live | set(restarted)):
|
|
794
|
+
return "unknown"
|
|
795
|
+
return "applied"
|
|
796
|
+
except ImportError:
|
|
797
|
+
return "restart_required"
|
|
798
|
+
except Exception: # noqa: BLE001
|
|
799
|
+
# Persistence already succeeded. Neither expose launch inputs in an exception nor retry an uncertain reconnect.
|
|
800
|
+
return "unknown"
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
def save_plugin_settings(key: str, values: Any, secret_envs: Any = None) -> dict:
|
|
804
|
+
"""Write manifest-declared, non-secret settings through the Agent's locked writer; returns the refreshed fields.
|
|
805
|
+
|
|
806
|
+
``secret_envs`` (secret key -> ``.env`` name the caller wrote) must still match the manifest before anything is written.
|
|
807
|
+
"""
|
|
808
|
+
if not key or not isinstance(values, dict) or not isinstance(secret_envs or {}, dict):
|
|
809
|
+
raise InvalidParams("plugins.settings_save requires a 'key' and a 'values' mapping")
|
|
810
|
+
modules = _plugin_settings_modules()
|
|
811
|
+
if modules is None:
|
|
812
|
+
raise RpcError("This Hermes Agent cannot edit plugin settings", condition="plugin_settings_unsupported")
|
|
813
|
+
plugins_cmd, plugins_settings = modules
|
|
814
|
+
found = plugins_cmd._find_plugin_entry(key)
|
|
815
|
+
if found is None:
|
|
816
|
+
raise RpcError(f"plugin {key!r} not found", condition="plugin_not_found")
|
|
817
|
+
plugin_dir = pathlib.Path(str(found[4])) if found[4] else None
|
|
818
|
+
current = {field["key"]: field for field in plugins_settings.plugin_settings_fields(found[5], plugin_dir)}
|
|
819
|
+
for secret, env in (secret_envs or {}).items():
|
|
820
|
+
field = current.get(str(secret))
|
|
821
|
+
if field is None or field.get("type") != "secret" or field.get("env") != env:
|
|
822
|
+
raise RpcError(f"{secret!r} is no longer stored in {env}", condition="plugin_settings_changed")
|
|
823
|
+
try:
|
|
824
|
+
written = plugins_settings.save_plugin_settings(found[5], plugin_dir, values)
|
|
825
|
+
except PermissionError as exc:
|
|
826
|
+
raise RpcError(str(exc), condition="plugin_settings_managed") from exc
|
|
827
|
+
except ValueError as exc:
|
|
828
|
+
raise InvalidParams(str(exc)) from exc
|
|
829
|
+
fields = plugins_settings.plugin_settings_fields(found[5], plugin_dir)
|
|
830
|
+
application = _apply_plugin_mcp_settings(plugins_cmd, plugin_dir, found[5])
|
|
831
|
+
return {"key": found[5], "written": written, "fields": fields, "runtime_application": application}
|
|
832
|
+
|
|
833
|
+
|
|
407
834
|
def register(registry) -> None:
|
|
408
835
|
@registry.method("commands.registry")
|
|
409
836
|
def registry_(ctx: CallContext, params: dict) -> dict:
|
|
@@ -413,16 +840,28 @@ def register(registry) -> None:
|
|
|
413
840
|
@registry.method("commands.exec")
|
|
414
841
|
def exec_(ctx: CallContext, params: dict) -> dict:
|
|
415
842
|
command = str(params.get("command") or "")
|
|
843
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
844
|
+
workspace = str(params.get("workspace") or "")
|
|
416
845
|
with scoped_home(profile_home_param(params)):
|
|
417
|
-
output = execute_agent_command(command)
|
|
846
|
+
output = execute_agent_command(command, session_id, workspace)
|
|
418
847
|
source = "agent"
|
|
419
848
|
if output is None:
|
|
420
|
-
|
|
849
|
+
from .chat import _turn_identity
|
|
850
|
+
|
|
851
|
+
# TAL-904: a chat's plugin command runs under that chat's session and workspace, as its turns do.
|
|
852
|
+
with _turn_identity(session_id, workspace) if session_id else contextlib.nullcontext():
|
|
853
|
+
output = execute_plugin_command(command, session_id)
|
|
421
854
|
source = "plugin"
|
|
422
855
|
if output is None:
|
|
423
856
|
raise RpcError(f"unknown command {parse_slash_command(command)[0]!r}", condition="command_not_found")
|
|
424
857
|
return {"output": output, "source": source}
|
|
425
858
|
|
|
859
|
+
@registry.method("commands.expand_prompt")
|
|
860
|
+
def expand_prompt_(ctx: CallContext, params: dict) -> dict:
|
|
861
|
+
with scoped_home(profile_home_param(params)):
|
|
862
|
+
return expand_prompt(str(params.get("command") or ""), str(params.get("workspace") or ""), params.get("enabled_toolsets"),
|
|
863
|
+
str(params.get("session_id") or "").strip())
|
|
864
|
+
|
|
426
865
|
@registry.method("commands.bundles")
|
|
427
866
|
def bundles(ctx: CallContext, params: dict) -> dict:
|
|
428
867
|
with scoped_home(profile_home_param(params)):
|
|
@@ -447,3 +886,34 @@ def register(registry) -> None:
|
|
|
447
886
|
def list_(ctx: CallContext, params: dict) -> dict:
|
|
448
887
|
with scoped_home(profile_home_param(params)):
|
|
449
888
|
return plugin_visibility(params.get("selected_providers") if isinstance(params.get("selected_providers"), dict) else {})
|
|
889
|
+
|
|
890
|
+
@registry.method("plugins.catalog")
|
|
891
|
+
def catalog_(ctx: CallContext, params: dict) -> dict:
|
|
892
|
+
from .plugin_catalog import catalog
|
|
893
|
+
with scoped_home(profile_home_param(params)):
|
|
894
|
+
return catalog(params.get('query', ''), params.get('offset', 0), params.get('limit', 20))
|
|
895
|
+
|
|
896
|
+
@registry.method("plugins.install")
|
|
897
|
+
def install_(ctx: CallContext, params: dict) -> dict:
|
|
898
|
+
from .plugin_catalog import install
|
|
899
|
+
with scoped_home(profile_home_param(params)):
|
|
900
|
+
return install(params.get('name'), params.get('consent_token'))
|
|
901
|
+
|
|
902
|
+
@registry.method("plugins.update")
|
|
903
|
+
def update(ctx: CallContext, params: dict) -> dict:
|
|
904
|
+
with scoped_home(profile_home_param(params)):
|
|
905
|
+
return update_plugin(str(params.get("key") or "").strip(), params.get("accept_caution", False), params.get("consent_token"))
|
|
906
|
+
|
|
907
|
+
@registry.method("plugins.isolation")
|
|
908
|
+
def isolation(ctx: CallContext, params: dict) -> dict:
|
|
909
|
+
return {"profiles": isolation_survey(profile_home_param(params, "base_home"))}
|
|
910
|
+
|
|
911
|
+
@registry.method("plugins.settings")
|
|
912
|
+
def settings(ctx: CallContext, params: dict) -> dict:
|
|
913
|
+
with scoped_home(profile_home_param(params)):
|
|
914
|
+
return plugin_settings()
|
|
915
|
+
|
|
916
|
+
@registry.method("plugins.settings_save")
|
|
917
|
+
def settings_save(ctx: CallContext, params: dict) -> dict:
|
|
918
|
+
with scoped_home(profile_home_param(params)):
|
|
919
|
+
return save_plugin_settings(str(params.get("key") or "").strip(), params.get("values"), params.get("secret_envs"))
|