@maudecode/talaria-web 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_release.json +8 -8
- package/dist/api/auth-raw.js +16 -16
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +2 -2
- package/dist/api/automation-raw.js +93 -38
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +99 -17
- package/dist/api/automation-router.js +22 -14
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1433 -37
- package/dist/api/chat-router.js +205 -90
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +6 -2
- package/dist/api/git-router.js +30 -30
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +3 -3
- package/dist/api/raw-routes.js +76 -62
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +5 -5
- package/dist/api/router.js +22 -22
- package/dist/api/router.js.map +1 -1
- package/dist/api/session-visibility.d.ts +4 -4
- package/dist/api/session-visibility.js +26 -16
- package/dist/api/session-visibility.js.map +1 -1
- package/dist/api/sessions-router.d.ts +2635 -151
- package/dist/api/sessions-router.js +193 -177
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +450 -11
- package/dist/api/settings-router.js +102 -49
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +2 -2
- package/dist/api/sse-routes.js +102 -80
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +58 -33
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +963 -109
- package/dist/api/tools-router.js +426 -72
- package/dist/api/tools-router.js.map +1 -1
- package/dist/api/transcribe-stream.d.ts +16 -0
- package/dist/api/transcribe-stream.js +172 -0
- package/dist/api/transcribe-stream.js.map +1 -0
- package/dist/app.d.ts +4 -1
- package/dist/app.js +80 -57
- package/dist/app.js.map +1 -1
- package/dist/auth/crypto.d.ts +3 -0
- package/dist/auth/crypto.js +18 -0
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/gate.js +14 -9
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/passkeys.d.ts +15 -14
- package/dist/auth/passkeys.js +89 -91
- package/dist/auth/passkeys.js.map +1 -1
- package/dist/auth/store.d.ts +17 -7
- package/dist/auth/store.js +93 -52
- package/dist/auth/store.js.map +1 -1
- package/dist/bin/talaria-web.js +12 -81
- package/dist/bin/talaria-web.js.map +1 -1
- package/dist/cli/ctl.js +8 -2
- package/dist/cli/ctl.js.map +1 -1
- package/dist/cli/dotenv.d.ts +5 -0
- package/dist/cli/dotenv.js +14 -2
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/cli/launcher.js +5 -5
- package/dist/cli/launcher.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +90 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/supervise.d.ts +24 -0
- package/dist/cli/supervise.js +147 -6
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +37 -11
- package/dist/config/agent-config.js +146 -64
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/fs/atomic.d.ts +4 -0
- package/dist/fs/atomic.js +19 -2
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +7 -0
- package/dist/fs/stat.js +27 -0
- package/dist/fs/stat.js.map +1 -0
- package/dist/http/context.d.ts +28 -9
- package/dist/http/context.js +77 -25
- package/dist/http/context.js.map +1 -1
- package/dist/onboarding.d.ts +2 -2
- package/dist/onboarding.js +10 -8
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.d.ts +12 -4
- package/dist/profiles/profiles.js +78 -30
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/projects.d.ts +15 -6
- package/dist/projects.js +55 -47
- package/dist/projects.js.map +1 -1
- package/dist/providers/catalog.d.ts +85 -14
- package/dist/providers/catalog.js +502 -146
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/env-file.d.ts +10 -3
- package/dist/providers/env-file.js +24 -75
- package/dist/providers/env-file.js.map +1 -1
- package/dist/providers/runtime-env.d.ts +4 -2
- package/dist/providers/runtime-env.js +9 -6
- package/dist/providers/runtime-env.js.map +1 -1
- package/dist/providers/tables.d.ts +3 -1
- package/dist/providers/tables.js +4 -2
- package/dist/providers/tables.js.map +1 -1
- package/dist/redact.js +56 -23
- package/dist/redact.js.map +1 -1
- package/dist/release.d.ts +7 -0
- package/dist/release.js +19 -3
- package/dist/release.js.map +1 -1
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.js +303 -96
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +31 -18
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +11 -4
- package/dist/sessions/anchor.js +33 -37
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-events.d.ts +2 -0
- package/dist/sessions/background-events.js +10 -0
- package/dist/sessions/background-events.js.map +1 -0
- package/dist/sessions/background-tasks.d.ts +49 -23
- package/dist/sessions/background-tasks.js +161 -89
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/background-updates.d.ts +15 -8
- package/dist/sessions/background-updates.js +101 -25
- package/dist/sessions/background-updates.js.map +1 -1
- package/dist/sessions/cli-sessions.d.ts +23 -6
- package/dist/sessions/cli-sessions.js +84 -84
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +38 -2
- package/dist/sessions/completions.js +348 -77
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +8 -0
- package/dist/sessions/compress.js +2 -2
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/drafts.d.ts +14 -10
- package/dist/sessions/drafts.js +38 -43
- package/dist/sessions/drafts.js.map +1 -1
- package/dist/sessions/export.d.ts +2 -0
- package/dist/sessions/export.js +6 -2
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +86 -0
- package/dist/sessions/gateway-sessions.js +914 -0
- package/dist/sessions/gateway-sessions.js.map +1 -0
- package/dist/sessions/gateway-watcher.d.ts +10 -11
- package/dist/sessions/gateway-watcher.js +25 -21
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/goals.d.ts +31 -0
- package/dist/sessions/goals.js +75 -0
- package/dist/sessions/goals.js.map +1 -0
- package/dist/sessions/journal.d.ts +5 -79
- package/dist/sessions/journal.js +15 -606
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +34 -18
- package/dist/sessions/list.js +161 -147
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +77 -13
- package/dist/sessions/merge.js +315 -65
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/notices.d.ts +22 -0
- package/dist/sessions/notices.js +72 -0
- package/dist/sessions/notices.js.map +1 -0
- package/dist/sessions/pending.d.ts +10 -4
- package/dist/sessions/pending.js +83 -7
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +85 -0
- package/dist/sessions/prefix-index.js +243 -0
- package/dist/sessions/prefix-index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +4 -7
- package/dist/sessions/recovery.js +100 -283
- package/dist/sessions/recovery.js.map +1 -1
- package/dist/sessions/relay.d.ts +20 -20
- package/dist/sessions/relay.js +205 -127
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +251 -78
- package/dist/sessions/service.js +1510 -564
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +20 -2
- package/dist/sessions/session.js +33 -5
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/shares.d.ts +7 -6
- package/dist/sessions/shares.js +22 -45
- package/dist/sessions/shares.js.map +1 -1
- package/dist/sessions/source-kind.js +1 -0
- package/dist/sessions/source-kind.js.map +1 -1
- package/dist/sessions/state-db-identity.d.ts +18 -0
- package/dist/sessions/state-db-identity.js +67 -0
- package/dist/sessions/state-db-identity.js.map +1 -0
- package/dist/sessions/state-db-worker.js +24 -5
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +157 -21
- package/dist/sessions/state-db.js +1145 -204
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/state-saved.d.ts +1 -1
- package/dist/sessions/state-saved.js +35 -11
- package/dist/sessions/state-saved.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +171 -0
- package/dist/sessions/storage/backend.js +19 -0
- package/dist/sessions/storage/backend.js.map +1 -0
- package/dist/sessions/storage/conformance.d.ts +20 -0
- package/dist/sessions/storage/conformance.js +237 -0
- package/dist/sessions/storage/conformance.js.map +1 -0
- package/dist/sessions/storage/document.d.ts +16 -0
- package/dist/sessions/storage/document.js +44 -0
- package/dist/sessions/storage/document.js.map +1 -0
- package/dist/sessions/storage/json-documents.d.ts +25 -0
- package/dist/sessions/storage/json-documents.js +277 -0
- package/dist/sessions/storage/json-documents.js.map +1 -0
- package/dist/sessions/storage/json-files.d.ts +23 -0
- package/dist/sessions/storage/json-files.js +244 -0
- package/dist/sessions/storage/json-files.js.map +1 -0
- package/dist/sessions/storage/json-installation.d.ts +3 -0
- package/dist/sessions/storage/json-installation.js +31 -0
- package/dist/sessions/storage/json-installation.js.map +1 -0
- package/dist/sessions/storage/json-journal.d.ts +113 -0
- package/dist/sessions/storage/json-journal.js +756 -0
- package/dist/sessions/storage/json-journal.js.map +1 -0
- package/dist/sessions/storage/json-recovery.d.ts +4 -0
- package/dist/sessions/storage/json-recovery.js +195 -0
- package/dist/sessions/storage/json-recovery.js.map +1 -0
- package/dist/sessions/storage/json.d.ts +82 -0
- package/dist/sessions/storage/json.js +350 -0
- package/dist/sessions/storage/json.js.map +1 -0
- package/dist/sessions/storage/row.d.ts +6 -0
- package/dist/sessions/storage/row.js +49 -0
- package/dist/sessions/storage/row.js.map +1 -0
- package/dist/sessions/storage/search-text.d.ts +4 -0
- package/dist/sessions/storage/search-text.js +16 -0
- package/dist/sessions/storage/search-text.js.map +1 -0
- package/dist/sessions/store.d.ts +67 -73
- package/dist/sessions/store.js +341 -607
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +12 -7
- package/dist/sessions/streams.js +58 -15
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.js +1 -1
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/todo.d.ts +5 -0
- package/dist/sessions/todo.js +28 -21
- package/dist/sessions/todo.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +8 -5
- package/dist/sessions/tool-display.js +28 -16
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +10 -1
- package/dist/sessions/turn-context.js +13 -6
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +110 -22
- package/dist/sessions/turn.js +918 -380
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +8 -13
- package/dist/sessions/wakeup-pause.js +31 -49
- package/dist/sessions/wakeup-pause.js.map +1 -1
- package/dist/sessions/window.js +13 -12
- package/dist/sessions/window.js.map +1 -1
- package/dist/settings.d.ts +19 -7
- package/dist/settings.js +179 -183
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/client.d.ts +41 -4
- package/dist/sidecar/client.js +192 -42
- package/dist/sidecar/client.js.map +1 -1
- package/dist/sidecar/discover.d.ts +2 -1
- package/dist/sidecar/discover.js +93 -10
- package/dist/sidecar/discover.js.map +1 -1
- package/dist/sidecar/env.d.ts +4 -0
- package/dist/sidecar/env.js +3 -0
- package/dist/sidecar/env.js.map +1 -0
- package/dist/sidecar/fake.d.ts +6 -2
- package/dist/sidecar/fake.js +34 -4
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/spa.d.ts +9 -4
- package/dist/spa.js +36 -12
- package/dist/spa.js.map +1 -1
- package/dist/startup-timing.d.ts +66 -0
- package/dist/startup-timing.js +129 -0
- package/dist/startup-timing.js.map +1 -0
- package/dist/test/env-file.d.ts +5 -0
- package/dist/test/env-file.js +88 -0
- package/dist/test/env-file.js.map +1 -0
- package/dist/test/fs-handles.d.ts +11 -0
- package/dist/test/fs-handles.js +31 -0
- package/dist/test/fs-handles.js.map +1 -0
- package/dist/test/harness.d.ts +1 -0
- package/dist/test/harness.js +1 -1
- package/dist/test/harness.js.map +1 -1
- package/dist/test/passkeys.d.ts +22 -0
- package/dist/test/passkeys.js +62 -0
- package/dist/test/passkeys.js.map +1 -0
- package/dist/test/storage.d.ts +15 -0
- package/dist/test/storage.js +26 -0
- package/dist/test/storage.js.map +1 -0
- package/dist/tools/commands.d.ts +6 -1
- package/dist/tools/commands.js +8 -2
- package/dist/tools/commands.js.map +1 -1
- package/dist/tools/connectors.d.ts +33 -0
- package/dist/tools/connectors.js +121 -0
- package/dist/tools/connectors.js.map +1 -0
- package/dist/tools/crons.d.ts +46 -5
- package/dist/tools/crons.js +100 -26
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +34 -5
- package/dist/tools/dashboard-plugins.js +146 -14
- package/dist/tools/dashboard-plugins.js.map +1 -1
- package/dist/tools/extensions.d.ts +5 -4
- package/dist/tools/extensions.js +213 -207
- package/dist/tools/extensions.js.map +1 -1
- package/dist/tools/gateway-restart.d.ts +82 -0
- package/dist/tools/gateway-restart.js +222 -0
- package/dist/tools/gateway-restart.js.map +1 -0
- package/dist/tools/health.d.ts +28 -4
- package/dist/tools/health.js +171 -50
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/hygiene.d.ts +4 -3
- package/dist/tools/hygiene.js +23 -9
- package/dist/tools/hygiene.js.map +1 -1
- package/dist/tools/insights.d.ts +1 -1
- package/dist/tools/insights.js +2 -2
- package/dist/tools/insights.js.map +1 -1
- package/dist/tools/kanban.d.ts +4 -2
- package/dist/tools/kanban.js +28 -19
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/mcp-health.js +74 -24
- package/dist/tools/mcp-health.js.map +1 -1
- package/dist/tools/mcp.js +19 -1
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/memory-masks.d.ts +5 -0
- package/dist/tools/memory-masks.js +256 -0
- package/dist/tools/memory-masks.js.map +1 -0
- package/dist/tools/memory.d.ts +29 -3
- package/dist/tools/memory.js +69 -27
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/plugin-oauth.d.ts +14 -0
- package/dist/tools/plugin-oauth.js +53 -0
- package/dist/tools/plugin-oauth.js.map +1 -0
- package/dist/tools/plugin-settings.d.ts +15 -0
- package/dist/tools/plugin-settings.js +90 -0
- package/dist/tools/plugin-settings.js.map +1 -0
- package/dist/tools/prune-advice.d.ts +50 -0
- package/dist/tools/prune-advice.js +114 -0
- package/dist/tools/prune-advice.js.map +1 -0
- package/dist/tools/skills.d.ts +13 -5
- package/dist/tools/skills.js +53 -19
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +102 -17
- package/dist/tools/update-notifications.js +400 -82
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/update-rollback.d.ts +11 -0
- package/dist/tools/update-rollback.js +28 -0
- package/dist/tools/update-rollback.js.map +1 -0
- package/dist/tools/updates.d.ts +100 -33
- package/dist/tools/updates.js +1085 -345
- package/dist/tools/updates.js.map +1 -1
- package/dist/util.d.ts +2 -0
- package/dist/util.js +5 -0
- package/dist/util.js.map +1 -1
- package/dist/workspace/git.d.ts +16 -1
- package/dist/workspace/git.js +291 -11
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +12 -9
- package/dist/workspace/media.js +98 -38
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/preview.js +4 -14
- package/dist/workspace/preview.js.map +1 -1
- package/dist/workspace/rollback.d.ts +8 -4
- package/dist/workspace/rollback.js +22 -12
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/workspaces.d.ts +15 -19
- package/dist/workspace/workspaces.js +55 -127
- package/dist/workspace/workspaces.js.map +1 -1
- package/dist/workspace/worktrees.js +170 -32
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +6 -4
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +29 -0
- package/sidecar/scripts/record-fixtures.py +12 -3
- package/sidecar/scripts/replay_sidecar.py +8 -0
- package/sidecar/scripts/suite_runner.py +458 -0
- package/sidecar/scripts/test.sh +11 -5
- package/sidecar/talaria_sidecar/__init__.py +6 -1
- package/sidecar/talaria_sidecar/__main__.py +13 -4
- package/sidecar/talaria_sidecar/agent_mutation.py +1111 -0
- package/sidecar/talaria_sidecar/agent_services.py +1116 -0
- package/sidecar/talaria_sidecar/context_detail.py +59 -0
- package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
- package/sidecar/talaria_sidecar/home.py +133 -14
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +211 -41
- package/sidecar/talaria_sidecar/methods/chat.py +1378 -200
- package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
- package/sidecar/talaria_sidecar/methods/commands.py +483 -13
- package/sidecar/talaria_sidecar/methods/config.py +195 -6
- package/sidecar/talaria_sidecar/methods/connectors.py +375 -0
- package/sidecar/talaria_sidecar/methods/cron.py +374 -36
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +215 -55
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +418 -0
- package/sidecar/talaria_sidecar/methods/goals.py +81 -41
- package/sidecar/talaria_sidecar/methods/kanban.py +82 -30
- package/sidecar/talaria_sidecar/methods/memory.py +84 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +144 -13
- package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
- package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
- package/sidecar/talaria_sidecar/methods/process.py +229 -16
- package/sidecar/talaria_sidecar/methods/profiles.py +48 -9
- package/sidecar/talaria_sidecar/methods/providers.py +196 -26
- package/sidecar/talaria_sidecar/methods/runtime.py +71 -1
- package/sidecar/talaria_sidecar/methods/skills.py +83 -5
- package/sidecar/talaria_sidecar/methods/state_db.py +405 -112
- package/sidecar/talaria_sidecar/methods/stt.py +159 -78
- package/sidecar/talaria_sidecar/methods/text.py +14 -1
- package/sidecar/talaria_sidecar/methods/toolsets.py +51 -0
- package/sidecar/talaria_sidecar/methods/usage.py +113 -14
- package/sidecar/talaria_sidecar/methods/worktree.py +145 -19
- package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
- package/sidecar/talaria_sidecar/rpc.py +70 -7
- package/sidecar/talaria_sidecar/runtime.py +122 -14
- package/sidecar/talaria_sidecar/speed.py +47 -0
- package/sidecar/talaria_sidecar/startup_timing.py +119 -0
- package/static/dist/FILES.txt +242 -215
- package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
- package/static/dist/assets/AppShell-3isgvoro.js +8 -0
- package/static/dist/assets/Button-f4n6dapf.js +1 -0
- package/static/dist/assets/ChatPage-k7b6xfax.js +4 -0
- package/static/dist/assets/ConnectTargets-juqvt5lm.js +1 -0
- package/static/dist/assets/Dialog-hta5utr3.js +1 -0
- package/static/dist/assets/ExtensionRoute-zrhjn0wm.js +1 -0
- package/static/dist/assets/Field-b6ez48oz.js +1 -0
- package/static/dist/assets/HubRoute-iwvso2tz.js +2 -0
- package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
- package/static/dist/assets/Markdown-jdeth7zq.js +2 -0
- package/static/dist/assets/MarkdownRenderer-fbswsgld.js +302 -0
- package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
- package/static/dist/assets/OAuthSignIn-bpd8hom3.js +1 -0
- package/static/dist/assets/ResourceSwitch-odi6dy2o.js +1 -0
- package/static/dist/assets/RightPanel-eu6enlo6.js +1 -0
- package/static/dist/assets/Select-kr07928w.js +1 -0
- package/static/dist/assets/SessionListPanel-etb2i54l.js +1 -0
- package/static/dist/assets/SettingsLayout-eu3xxp23.js +1 -0
- package/static/dist/assets/States-icab19yg.js +1 -0
- package/static/dist/assets/TerminalPanel-hngmsr8b.js +16 -0
- package/static/dist/assets/Toaster-nb2uzjw1.js +1 -0
- package/static/dist/assets/_app-ga1moszl.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-na62087t.js +1 -0
- package/static/dist/assets/_app.index-jypgdqoi.js +1 -0
- package/static/dist/assets/_app.insights-kabejdtm.js +1 -0
- package/static/dist/assets/_app.kanban-m19kfcmx.js +1 -0
- package/static/dist/assets/_app.logs-iw4m96sz.js +1 -0
- package/static/dist/assets/_app.memory-jq5frwcg.js +1 -0
- package/static/dist/assets/_app.profiles-kwa3m7rp.js +1 -0
- package/static/dist/assets/_app.session._sessionId-o5lyeipj.js +1 -0
- package/static/dist/assets/_app.settings-ckl8hdll.js +1 -0
- package/static/dist/assets/_app.settings._section-dtdjk98a.js +3 -0
- package/static/dist/assets/_app.skills-n016rihd.js +1 -0
- package/static/dist/assets/_app.tasks-n8zuqsqe.js +1 -0
- package/static/dist/assets/_app.todos-btew5v2s.js +1 -0
- package/static/dist/assets/_app.workspaces-lnfk95ch.js +1 -0
- package/static/dist/assets/abnfDiagram-VCTEODGH-dttheegb.js +1 -0
- package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
- package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
- package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
- package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-ic435919.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-8r3glgiq.js +36 -0
- package/static/dist/assets/archive-il7c6053.js +1 -0
- package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
- package/static/dist/assets/back-gu3nu279.js +1 -0
- package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-jenyos6c.js} +4 -4
- package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-nzlx7yc4.js} +1 -1
- package/static/dist/assets/cancel-bsnfo36u.js +1 -0
- package/static/dist/assets/channel-dsbtk01y.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-g0cru63b.js} +20 -20
- package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-7rkswkjw.js} +1 -1
- package/static/dist/assets/chunk-DU6HZSFF-fn73jzdo.js +128 -0
- package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-oey8e72m.js} +1 -1
- package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
- package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-l2a32wiy.js} +6 -6
- package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-o9dwzh8h.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-eblwj20b.js} +5 -5
- package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-o2mufspb.js} +1 -1
- package/static/dist/assets/chunk-OSK3NFVY-ijp9pw29.js +10 -0
- package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-hs9hqwl4.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-bp9rsqez.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-brkprov6.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-gmpv0pxz.js} +13 -13
- package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-oldm08fu.js} +4 -4
- package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-ooqilfv7.js} +6 -6
- package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +1 -0
- package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
- package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
- package/static/dist/assets/copied-bz3gkazh.js +1 -0
- package/static/dist/assets/copy-jo006coq.js +1 -0
- package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
- package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
- package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
- package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
- package/static/dist/assets/cynefin-OW5HDTMX-d47op7qs.js +1 -0
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-doa7594y.js +62 -0
- package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
- package/static/dist/assets/dagre-GXQ25YYZ-os768dp4.js +4 -0
- package/static/dist/assets/dagre-o5jmjz46.js +1 -0
- package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-fyi81nxd.js} +4 -4
- package/static/dist/assets/diagram-UQ7AKVKN-j3exggaq.js +41 -0
- package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-omo1en2l.js} +1 -1
- package/static/dist/assets/diagram-VX7I27RA-oro2cyu0.js +24 -0
- package/static/dist/assets/diagram-Z3DM3KII-byt9vdb7.js +24 -0
- package/static/dist/assets/dist-crc46di9.js +7 -0
- package/static/dist/assets/dist-etpoyscq.js +44 -0
- package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
- package/static/dist/assets/ebnfDiagram-PWID7BFC-ee3haugh.js +1 -0
- package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
- package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
- package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
- package/static/dist/assets/erDiagram-RLTQ6QDP-d1e93yff.js +99 -0
- package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-i1ihb40c.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +1 -0
- package/static/dist/assets/folder-plus-ivoglq98.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-m7g0jud4.js} +1 -1
- package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-hzdj07yy.js +1 -0
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-dm9agbna.js} +1 -1
- package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
- package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
- package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
- package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
- package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
- package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
- package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-mmgz2czu.js +1 -0
- package/static/dist/assets/host-fr6lni1p.js +1 -0
- package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
- package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
- package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
- package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
- package/static/dist/assets/index-73649w7o.js +10 -0
- package/static/dist/assets/index-lhf1fsdf.css +2 -0
- package/static/dist/assets/info-A6RAGUB7-lll1dqmm.js +1 -0
- package/static/dist/assets/infoDiagram-27XIBGKW-k7esc639.js +2 -0
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-lgr6k9wo.js} +6 -6
- package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
- package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
- package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
- package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-ndmbxuqk.js} +1 -1
- package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
- package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
- package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
- package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
- package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-mjxym0jp.js} +28 -28
- package/static/dist/assets/katex-cbdd1ohw.css +1 -0
- package/static/dist/assets/katex-pbij2oo6.js +257 -0
- package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-cwb6l7xh.js +1 -0
- package/static/dist/assets/{line-meizqsvn.js → line-mtr5k6il.js} +1 -1
- package/static/dist/assets/linear-jlwrvvy6.js +1 -0
- package/static/dist/assets/link-iadw4ghw.js +2 -0
- package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
- package/static/dist/assets/locale-cs-n41hptse.js +5 -0
- package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
- package/static/dist/assets/locale-es-ih078lco.js +5 -0
- package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
- package/static/dist/assets/locale-it-kb96jufy.js +5 -0
- package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
- package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
- package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
- package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
- package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
- package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
- package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
- package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
- package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
- package/static/dist/assets/login-lkhtzfcl.js +1 -0
- package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
- package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
- package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +1 -0
- package/static/dist/assets/mermaid-parser.core-k91vdnvi.js +7 -0
- package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-ehztfea4.js} +28 -28
- package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
- package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
- package/static/dist/assets/onboarding-f67z0a2r.js +1 -0
- package/static/dist/assets/packet-AYTQ26CC-ok2xrblz.js +1 -0
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/pegDiagram-XKGWAZYB-ec3rpj0m.js +1 -0
- package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
- package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
- package/static/dist/assets/pie-WAS4IAKB-iwkir23u.js +1 -0
- package/static/dist/assets/pieDiagram-E7YTZNPT-fcpqpekh.js +39 -0
- package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
- package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-lqsync43.js} +1 -1
- package/static/dist/assets/queryKeys-ed4n2egc.js +9 -0
- package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
- package/static/dist/assets/radar-RG4KPBEZ-hje4jbk6.js +1 -0
- package/static/dist/assets/railroad-74A4TZTK-gll9n6qi.js +1 -0
- package/static/dist/assets/railroad-abnf-HS5TGJTU-o6h6lpn4.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-juaefj6o.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-cgfhvpah.js +1 -0
- package/static/dist/assets/railroadDiagram-O6MQD6OU-lp3w7awf.js +1 -0
- package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
- package/static/dist/assets/refresh-cw-iccm7a4e.js +1 -0
- package/static/dist/assets/refresh-i9ya9dvl.js +1 -0
- package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
- package/static/dist/assets/registry-g7w3353u.js +1 -0
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ha8eibcf.js +84 -0
- package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
- package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
- package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
- package/static/dist/assets/runtime-nlxpnegr.js +1 -0
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-oxf31pr9.js} +1 -1
- package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
- package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-jiq8lhyo.js} +11 -11
- package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
- package/static/dist/assets/share._token-o76ki0ly.js +2 -0
- package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
- package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
- package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
- package/static/dist/assets/sliders-horizontal-ddcs88av.js +1 -0
- package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
- package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
- package/static/dist/assets/src-h89s0hs4.js +1 -0
- package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-f3fslnon.js +1 -0
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +1 -0
- package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
- package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
- package/static/dist/assets/swimlanes-42K2YHIH-k1hmk7jf.js +1 -0
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +8 -0
- package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
- package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
- package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-n3ncfy9r.js} +8 -8
- package/static/dist/assets/toast-liparz2j.js +56 -0
- package/static/dist/assets/treeView-Q6P3EWNA-l3y2pejt.js +1 -0
- package/static/dist/assets/treemap-WGGIJYW6-jown9axh.js +1 -0
- package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
- package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
- package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
- package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
- package/static/dist/assets/untitled-mj86r4gz.js +1 -0
- package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
- package/static/dist/assets/useForm-o4uu74mx.js +1 -0
- package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-ftsveu84.js} +1 -1
- package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-crqueqga.js} +1 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-dh59uq1c.js +34 -0
- package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
- package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
- package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
- package/static/dist/assets/wardley-WFR3VGLG-e6d74b0j.js +1 -0
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hnofh78f.js +78 -0
- package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
- package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
- package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-bpymjelb.js} +6 -6
- package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
- package/static/dist/extension-sdk.js +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +180 -136
- package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
- package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
- package/static/dist/assets/Dialog-g355qxhp.js +0 -1
- package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
- package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
- package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
- package/static/dist/assets/Markdown-lwviulmg.css +0 -1
- package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
- package/static/dist/assets/Select-kddq75qc.js +0 -1
- package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
- package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
- package/static/dist/assets/States-eq6fe29m.js +0 -1
- package/static/dist/assets/Toaster-pc247u9f.js +0 -1
- package/static/dist/assets/_app-f8n1i0m1.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +0 -1
- package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
- package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
- package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
- package/static/dist/assets/_app.logs-i69qds98.js +0 -1
- package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
- package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
- package/static/dist/assets/_app.session._sessionId-fn1bhde6.js +0 -1
- package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
- package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
- package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
- package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
- package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
- package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
- package/static/dist/assets/abnfDiagram-VCTEODGH-c8kdixke.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
- package/static/dist/assets/architectureDiagram-5GKGNRK7-cku06x1p.js +0 -36
- package/static/dist/assets/back-h7aun7ew.js +0 -1
- package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
- package/static/dist/assets/channel-b2zo73z1.js +0 -1
- package/static/dist/assets/chunk-DU6HZSFF-ofajdixh.js +0 -128
- package/static/dist/assets/chunk-OSK3NFVY-e7gkikcw.js +0 -10
- package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
- package/static/dist/assets/copied-hcplv46p.js +0 -1
- package/static/dist/assets/copy-magtofyp.js +0 -1
- package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
- package/static/dist/assets/cynefin-OW5HDTMX-siqlulkl.js +0 -1
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-i648tah9.js +0 -62
- package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
- package/static/dist/assets/dagre-GXQ25YYZ-mwn6uc17.js +0 -4
- package/static/dist/assets/dagre-lkoknbjn.js +0 -1
- package/static/dist/assets/diagram-UQ7AKVKN-mekq7zgq.js +0 -41
- package/static/dist/assets/diagram-VX7I27RA-xe6r5qfw.js +0 -24
- package/static/dist/assets/diagram-Z3DM3KII-nq07dg7k.js +0 -24
- package/static/dist/assets/ebnfDiagram-PWID7BFC-c62ipm3g.js +0 -1
- package/static/dist/assets/endpoints-klbxod4t.js +0 -64
- package/static/dist/assets/erDiagram-RLTQ6QDP-h39kmnzy.js +0 -99
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-fr2i7caa.js +0 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-jwpop9p8.js +0 -1
- package/static/dist/assets/host-i828xuo7.js +0 -1
- package/static/dist/assets/index-eh8zilnv.css +0 -2
- package/static/dist/assets/index-r648f4o1.js +0 -11
- package/static/dist/assets/info-A6RAGUB7-h11x0dxo.js +0 -1
- package/static/dist/assets/infoDiagram-27XIBGKW-dfh47dw9.js +0 -2
- package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
- package/static/dist/assets/linear-becwlnhk.js +0 -1
- package/static/dist/assets/link-oot2yn73.js +0 -1
- package/static/dist/assets/login-gu28l9ou.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
- package/static/dist/assets/mermaid-parser.core-ntne45i9.js +0 -7
- package/static/dist/assets/not-found-ccnnac39.js +0 -1
- package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
- package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
- package/static/dist/assets/packet-AYTQ26CC-l6jdka8p.js +0 -1
- package/static/dist/assets/pegDiagram-XKGWAZYB-g1er3bxj.js +0 -1
- package/static/dist/assets/pie-WAS4IAKB-i0ylcrt9.js +0 -1
- package/static/dist/assets/pieDiagram-E7YTZNPT-fbz1e55z.js +0 -39
- package/static/dist/assets/radar-RG4KPBEZ-f9b70aa4.js +0 -1
- package/static/dist/assets/railroad-74A4TZTK-lgsuoeda.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
- package/static/dist/assets/railroadDiagram-O6MQD6OU-eqpy9fnz.js +0 -1
- package/static/dist/assets/refresh-abtu93ke.js +0 -1
- package/static/dist/assets/refresh-cw-hlwb02qv.js +0 -1
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ogf6puhi.js +0 -84
- package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
- package/static/dist/assets/root-mbklpuv4.js +0 -1
- package/static/dist/assets/saved-girnabkf.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
- package/static/dist/assets/share._token-kl0r7ido.js +0 -2
- package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +0 -1
- package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
- package/static/dist/assets/src-hjyib4mu.js +0 -1
- package/static/dist/assets/sse-iwku0sjo.js +0 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-fyoznpcs.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
- package/static/dist/assets/swimlanes-42K2YHIH-oefldhfy.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
- package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
- package/static/dist/assets/treeView-Q6P3EWNA-f7hcci5o.js +0 -1
- package/static/dist/assets/treemap-WGGIJYW6-nl85071a.js +0 -1
- package/static/dist/assets/units-kgxzxfhi.js +0 -1
- package/static/dist/assets/untitled-cikfjntn.js +0 -1
- package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
- package/static/dist/assets/useLocale-o59tbiea.js +0 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-h5hzbk0n.js +0 -34
- package/static/dist/assets/wardley-WFR3VGLG-jftvpm3e.js +0 -1
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hedh85ge.js +0 -78
- /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
|
@@ -1,16 +1,22 @@
|
|
|
1
|
-
"""``config
|
|
2
|
-
Agent's per-model reasoning capability.
|
|
1
|
+
"""``config.*``, ``models.reasoning_efforts`` and ``personalities.list``: a profile's ``config.yaml`` and ``.env``,
|
|
2
|
+
the Agent's per-model reasoning capability, and the personalities the Agent offers for a config.
|
|
3
3
|
|
|
4
4
|
The TypeScript server owns every config.yaml *policy* (which keys mean what);
|
|
5
5
|
the sidecar only parses and serialises YAML with the Agent's own parser so the
|
|
6
6
|
Node side needs no YAML dependency. Writes are atomic and keep the file's mode.
|
|
7
|
+
``.env`` edits use the Agent's own line helpers under the ``<.env>.lock`` the
|
|
8
|
+
gateway, CLI and plugins also take, so concurrent writers never drop a key.
|
|
7
9
|
"""
|
|
8
10
|
|
|
9
11
|
from __future__ import annotations
|
|
10
12
|
|
|
13
|
+
import contextlib
|
|
14
|
+
import copy
|
|
11
15
|
import importlib
|
|
16
|
+
import io
|
|
12
17
|
import logging
|
|
13
18
|
import os
|
|
19
|
+
import re
|
|
14
20
|
import tempfile
|
|
15
21
|
from pathlib import Path
|
|
16
22
|
|
|
@@ -69,12 +75,82 @@ def _write_target(path: Path) -> Path:
|
|
|
69
75
|
return target
|
|
70
76
|
|
|
71
77
|
|
|
72
|
-
def
|
|
78
|
+
def _same_config_value(left, right) -> bool:
|
|
79
|
+
"""Compare decoded JSON values without treating booleans as numbers."""
|
|
80
|
+
if type(left) is not type(right):
|
|
81
|
+
return False
|
|
82
|
+
if isinstance(left, dict):
|
|
83
|
+
return left.keys() == right.keys() and all(_same_config_value(left[key], right[key]) for key in left)
|
|
84
|
+
if isinstance(left, list):
|
|
85
|
+
return len(left) == len(right) and all(_same_config_value(a, b) for a, b in zip(left, right))
|
|
86
|
+
return left == right
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _split_config_aliases(text: str, desired: dict) -> str:
|
|
90
|
+
"""Keep the Agent's round-trip document, separating aliases with different requested values."""
|
|
91
|
+
roundtrip = getattr(yaml_parser(), "roundtrip_yaml", None)
|
|
92
|
+
if roundtrip is None:
|
|
93
|
+
return text
|
|
94
|
+
parser = roundtrip()
|
|
95
|
+
document = parser.load(text)
|
|
96
|
+
seen = {}
|
|
97
|
+
changed = False
|
|
98
|
+
|
|
99
|
+
def split(node, value):
|
|
100
|
+
nonlocal changed
|
|
101
|
+
if not (isinstance(node, dict) and isinstance(value, dict) or isinstance(node, list) and isinstance(value, list)):
|
|
102
|
+
return node
|
|
103
|
+
previous = seen.get(id(node))
|
|
104
|
+
if previous is not None:
|
|
105
|
+
if _same_config_value(previous[1], value):
|
|
106
|
+
return node
|
|
107
|
+
node = copy.deepcopy(node)
|
|
108
|
+
# Copied explicit anchor names must not collide with the original subtree.
|
|
109
|
+
pending, cleared = [node], set()
|
|
110
|
+
while pending:
|
|
111
|
+
child = pending.pop()
|
|
112
|
+
if id(child) in cleared:
|
|
113
|
+
continue
|
|
114
|
+
cleared.add(id(child))
|
|
115
|
+
if hasattr(child, "yaml_set_anchor"):
|
|
116
|
+
child.yaml_set_anchor(None)
|
|
117
|
+
if isinstance(child, dict):
|
|
118
|
+
pending.extend(child.values())
|
|
119
|
+
elif isinstance(child, list):
|
|
120
|
+
pending.extend(child)
|
|
121
|
+
changed = True
|
|
122
|
+
seen[id(node)] = (node, value)
|
|
123
|
+
for key in value if isinstance(value, dict) else range(min(len(node), len(value))):
|
|
124
|
+
if not isinstance(node, dict) or key in node:
|
|
125
|
+
node[key] = split(node[key], value[key])
|
|
126
|
+
return node
|
|
127
|
+
|
|
128
|
+
split(document, desired)
|
|
129
|
+
if not changed:
|
|
130
|
+
return text
|
|
131
|
+
output = io.StringIO()
|
|
132
|
+
parser.dump(document, output)
|
|
133
|
+
return output.getvalue()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def write_config(path: Path, config: dict, *, profile_home: Path | None = None) -> dict:
|
|
73
137
|
if not isinstance(config, dict):
|
|
74
138
|
raise InvalidParams("config must be an object")
|
|
139
|
+
try:
|
|
140
|
+
managed = importlib.import_module("hermes_constants").get_managed_system(profile_home)
|
|
141
|
+
except Exception as exc: # noqa: BLE001
|
|
142
|
+
raise RpcError("Cannot verify config.yaml management policy; repair the Agent installation before saving.",
|
|
143
|
+
condition="config_policy_unavailable") from exc
|
|
144
|
+
if managed is not None:
|
|
145
|
+
raise RpcError("config.yaml is package-managed. Update the declarative configuration instead.",
|
|
146
|
+
condition="config_write_refused")
|
|
75
147
|
target = _write_target(path)
|
|
76
148
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
77
|
-
|
|
149
|
+
try:
|
|
150
|
+
replace = getattr(importlib.import_module("hermes_cli.config"), "atomic_config_replace", None)
|
|
151
|
+
except Exception: # noqa: BLE001
|
|
152
|
+
# Operator config must remain writable even when Agent imports are broken.
|
|
153
|
+
replace = None
|
|
78
154
|
mode = None
|
|
79
155
|
try:
|
|
80
156
|
mode = target.stat().st_mode & 0o777
|
|
@@ -83,11 +159,24 @@ def write_config(path: Path, config: dict) -> dict:
|
|
|
83
159
|
fd, tmp = tempfile.mkstemp(dir=str(target.parent), prefix=".config_", suffix=".tmp")
|
|
84
160
|
try:
|
|
85
161
|
with os.fdopen(fd, "w", encoding="utf-8") as handle:
|
|
86
|
-
|
|
162
|
+
if replace is not None:
|
|
163
|
+
# Stage the original document so the Agent retains comments; check the real link before committing.
|
|
164
|
+
try:
|
|
165
|
+
handle.write(_split_config_aliases(target.read_text(encoding="utf-8"), config))
|
|
166
|
+
except FileNotFoundError:
|
|
167
|
+
pass
|
|
168
|
+
else:
|
|
169
|
+
parser = yaml_parser()
|
|
170
|
+
handle.write(parser.safe_dump(config, sort_keys=False, allow_unicode=True,
|
|
171
|
+
width=getattr(parser, "ROUNDTRIP_YAML_WIDTH", 2**31 - 1)))
|
|
87
172
|
handle.flush()
|
|
88
173
|
os.fsync(handle.fileno())
|
|
174
|
+
if replace is not None:
|
|
175
|
+
replace(Path(tmp), config)
|
|
89
176
|
if mode is not None:
|
|
90
177
|
os.chmod(tmp, mode)
|
|
178
|
+
if not _same_config_value(read_config(Path(tmp))["config"], config):
|
|
179
|
+
raise RpcError("Staged config.yaml does not match the requested values", condition="config_invalid")
|
|
91
180
|
# A link retargeted while the temp file was being written would otherwise send the write to the wrong file.
|
|
92
181
|
if _write_target(path) != target:
|
|
93
182
|
raise RpcError(f"{path} was retargeted while config.yaml was being written; retry", condition="config_changed")
|
|
@@ -101,6 +190,88 @@ def write_config(path: Path, config: dict) -> dict:
|
|
|
101
190
|
return {"ok": True, "path": str(path)}
|
|
102
191
|
|
|
103
192
|
|
|
193
|
+
_ENV_NAME = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _env_refusal(agent_config, key: str, action: str) -> str | None:
|
|
197
|
+
"""The Agent's ``.env`` write-lock refusal (package-managed install or administrator-managed key)."""
|
|
198
|
+
refusal = getattr(agent_config, "env_write_refusal", None)
|
|
199
|
+
if refusal is not None:
|
|
200
|
+
return refusal(key, action)
|
|
201
|
+
# Agent 0.21.5 only reports the refusal on stderr.
|
|
202
|
+
return f"Cannot {action} {key}: this Hermes installation manages it" if agent_config._env_write_blocked(key, action) else None
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _env_lock(agent_config, path: Path):
|
|
206
|
+
"""The Agent's ``<.env>.lock`` (Agent 0.21.6+); older Agents have none to share."""
|
|
207
|
+
lock = getattr(agent_config, "_env_write_lock", None)
|
|
208
|
+
return lock(path) if lock is not None else contextlib.nullcontext()
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def env_write(home: Path, updates) -> dict:
|
|
212
|
+
"""Upsert ``updates`` into ``home``'s ``.env`` (``None`` removes a key) with the Agent's own line helpers, under
|
|
213
|
+
the lock its ``save_env_value`` / ``remove_env_value`` take, in one atomic replace.
|
|
214
|
+
|
|
215
|
+
Unlike those two, nothing is published into ``os.environ``: other threads (a gateway spawn snapshotting the
|
|
216
|
+
environment) must never see another profile's key, and ``runtime.env`` alone owns this process's environment.
|
|
217
|
+
Values are trimmed and an empty one is skipped; a value the Agent would strip or quote is refused. Every key is
|
|
218
|
+
checked against the Agent's refusals before the write, and the file ends 0600.
|
|
219
|
+
"""
|
|
220
|
+
if not isinstance(updates, dict) or not all(isinstance(k, str) and _ENV_NAME.match(k) and (v is None or isinstance(v, str)) for k, v in updates.items()):
|
|
221
|
+
raise InvalidParams("updates must map variable names to strings or null")
|
|
222
|
+
changes: dict[str, str | None] = {}
|
|
223
|
+
for key, value in updates.items():
|
|
224
|
+
if value is not None:
|
|
225
|
+
value = value.strip()
|
|
226
|
+
if not value:
|
|
227
|
+
continue
|
|
228
|
+
if "\n" in value or "\r" in value:
|
|
229
|
+
raise InvalidParams("API key must not contain newline characters.")
|
|
230
|
+
# The Agent would strip non-ASCII and quote the rest; refused instead, so the running process and the
|
|
231
|
+
# server's reader see exactly the bytes the file holds.
|
|
232
|
+
if any(not "!" <= c <= "~" or c in "#\"'" for c in value):
|
|
233
|
+
raise InvalidParams("API key must not contain spaces, quotes, '#' or non-ASCII characters.")
|
|
234
|
+
changes[key] = value
|
|
235
|
+
from hermes_cli import config as agent_config
|
|
236
|
+
|
|
237
|
+
with scoped_home(home):
|
|
238
|
+
for key, value in changes.items():
|
|
239
|
+
refusal = _env_refusal(agent_config, key, "remove" if value is None else "set")
|
|
240
|
+
if refusal:
|
|
241
|
+
raise RpcError(refusal, condition="env_write_refused")
|
|
242
|
+
try:
|
|
243
|
+
agent_config.ensure_hermes_home()
|
|
244
|
+
path = agent_config.get_env_path()
|
|
245
|
+
with _env_lock(agent_config, path):
|
|
246
|
+
existed = path.exists()
|
|
247
|
+
lines = agent_config._read_env_lines(path) if existed else []
|
|
248
|
+
before = list(lines)
|
|
249
|
+
for key, value in changes.items():
|
|
250
|
+
defines = agent_config._env_line_defines_key
|
|
251
|
+
if value is None:
|
|
252
|
+
lines = [line for line in lines if not defines(line, key)]
|
|
253
|
+
continue
|
|
254
|
+
agent_config.validate_env_var_name_for_write(key)
|
|
255
|
+
entry = f"{key}={value}\n"
|
|
256
|
+
at = next((i for i, line in enumerate(lines) if defines(line, key)), None)
|
|
257
|
+
if at is not None:
|
|
258
|
+
lines[at] = entry
|
|
259
|
+
else:
|
|
260
|
+
if lines and not lines[-1].endswith("\n"):
|
|
261
|
+
lines[-1] += "\n"
|
|
262
|
+
lines.append(entry)
|
|
263
|
+
if lines != before:
|
|
264
|
+
agent_config._write_env_lines(path, lines, preserve_mode=existed)
|
|
265
|
+
except TimeoutError as exc:
|
|
266
|
+
raise RpcError(str(exc), condition="env_locked") from exc
|
|
267
|
+
except ValueError as exc:
|
|
268
|
+
raise RpcError(str(exc), condition="env_write_refused") from exc
|
|
269
|
+
agent_config.invalidate_env_cache()
|
|
270
|
+
if path.exists():
|
|
271
|
+
os.chmod(path, 0o600)
|
|
272
|
+
return {"ok": True, "path": str(path)}
|
|
273
|
+
|
|
274
|
+
|
|
104
275
|
def reasoning_efforts(model: str, provider: str) -> dict:
|
|
105
276
|
"""Levels the Agent would offer for ``model`` on ``provider`` (``hermes_cli.main_provider_setup``)."""
|
|
106
277
|
efforts: list[str] | None = None
|
|
@@ -122,6 +293,16 @@ def reasoning_efforts(model: str, provider: str) -> dict:
|
|
|
122
293
|
return {"efforts": [str(e) for e in (efforts or [])], "supports_reasoning": supports_reasoning}
|
|
123
294
|
|
|
124
295
|
|
|
296
|
+
def personalities(config) -> list[dict]:
|
|
297
|
+
"""TAL-901: ``config``'s personalities as the Agent offers them (``hermes_cli.personality``), with its list preview
|
|
298
|
+
and rendered prompt."""
|
|
299
|
+
from hermes_cli.personality import available_personalities, describe_personality, render_personality_prompt
|
|
300
|
+
|
|
301
|
+
if not isinstance(config, dict):
|
|
302
|
+
raise InvalidParams("config must be a mapping")
|
|
303
|
+
return [{"name": name, "description": describe_personality(value), "prompt": render_personality_prompt(value)} for name, value in available_personalities(config).items()]
|
|
304
|
+
|
|
305
|
+
|
|
125
306
|
def register(registry) -> None:
|
|
126
307
|
@registry.method("config.get", requires_agent=False)
|
|
127
308
|
def get(ctx: CallContext, params: dict) -> dict:
|
|
@@ -129,9 +310,17 @@ def register(registry) -> None:
|
|
|
129
310
|
|
|
130
311
|
@registry.method("config.set", requires_agent=False)
|
|
131
312
|
def set_(ctx: CallContext, params: dict) -> dict:
|
|
132
|
-
return write_config(config_path_param(params), params.get("config"))
|
|
313
|
+
return write_config(config_path_param(params), params.get("config"), profile_home=profile_home_param(params))
|
|
314
|
+
|
|
315
|
+
@registry.method("config.env_write")
|
|
316
|
+
def env_write_(ctx: CallContext, params: dict) -> dict:
|
|
317
|
+
return env_write(profile_home_param(params), params.get("updates"))
|
|
133
318
|
|
|
134
319
|
@registry.method("models.reasoning_efforts")
|
|
135
320
|
def efforts(ctx: CallContext, params: dict) -> dict:
|
|
136
321
|
with scoped_home(profile_home_param(params)):
|
|
137
322
|
return reasoning_efforts(str(params.get("model") or ""), str(params.get("provider") or ""))
|
|
323
|
+
|
|
324
|
+
@registry.method("personalities.list")
|
|
325
|
+
def personalities_(ctx: CallContext, params: dict) -> dict:
|
|
326
|
+
return {"personalities": personalities(params.get("config"))}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
"""``connectors.*``: Nous tool-gateway apps over the Agent's portal client (TAL-818).
|
|
2
|
+
|
|
3
|
+
The page's reads and writes (catalog, accounts, remove, tools, policy) call ``PortalConnectorClient``; a connect
|
|
4
|
+
runs the Agent's account-owned operation (``tools.connectors.account``), and a chat's ``manage_connections`` card
|
|
5
|
+
registers its session operation here through ``remember_chat_operation``. Every call runs under the profile's
|
|
6
|
+
``scoped_home``; the server composes what the page and card show.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import inspect
|
|
12
|
+
import json
|
|
13
|
+
import logging
|
|
14
|
+
import threading
|
|
15
|
+
from collections import OrderedDict
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from types import SimpleNamespace
|
|
18
|
+
|
|
19
|
+
from ..errors import InvalidParams, RpcError
|
|
20
|
+
from ..home import profile_home_param, scoped_home
|
|
21
|
+
from ..rpc import CallContext
|
|
22
|
+
|
|
23
|
+
log = logging.getLogger("talaria_sidecar.connectors")
|
|
24
|
+
|
|
25
|
+
# Operations the page or a chat card may still read, by (profile home, op_id). The Agent's ``live`` registry drops an
|
|
26
|
+
# operation once it settles, so its final state is kept here for the next poll. Only settled operations age out (oldest
|
|
27
|
+
# first, past 64): an open one is someone's card, and the Agent bounds those (one per session, settled by its deadline).
|
|
28
|
+
_OPS: OrderedDict[tuple[str, str], object] = OrderedDict()
|
|
29
|
+
_OPS_CAP = 64
|
|
30
|
+
_OPS_LOCK = threading.Lock()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def available() -> bool:
|
|
34
|
+
try:
|
|
35
|
+
from tools.connectors import connectors_available
|
|
36
|
+
except Exception: # noqa: BLE001 - an Agent without connectors
|
|
37
|
+
return False
|
|
38
|
+
return bool(connectors_available())
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _open(*, creates_guest: bool = False) -> None:
|
|
42
|
+
"""Only explicit Connect may provision; every other page action is noncreating."""
|
|
43
|
+
if not available():
|
|
44
|
+
raise RpcError("Connectors are not available.", condition="connectors_unavailable")
|
|
45
|
+
if not creates_guest:
|
|
46
|
+
return
|
|
47
|
+
try:
|
|
48
|
+
from tools.connectors import ensure_guest_identity
|
|
49
|
+
except Exception: # noqa: BLE001 - an Agent before guest identities
|
|
50
|
+
return
|
|
51
|
+
if failure := ensure_guest_identity():
|
|
52
|
+
raise RpcError(failure, condition="connectors_failed")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _portal(*, refresh_auth: bool = False):
|
|
56
|
+
from tools.connectors.portal.client import PortalConnectorClient
|
|
57
|
+
|
|
58
|
+
# Explicit writes retain native refresh; reads never acquire that authority.
|
|
59
|
+
if refresh_auth:
|
|
60
|
+
return PortalConnectorClient()
|
|
61
|
+
from tools.managed_tool_gateway import peek_nous_access_token
|
|
62
|
+
|
|
63
|
+
# The normal token reader may refresh and replace a dead guest. Page reads must never own auth writes.
|
|
64
|
+
def headers(_url):
|
|
65
|
+
token = peek_nous_access_token()
|
|
66
|
+
return {"Authorization": f"Bearer {token}"} if token else {}
|
|
67
|
+
|
|
68
|
+
return PortalConnectorClient(header_provider=headers)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _authenticated(client) -> bool:
|
|
72
|
+
from tools.connectors.gateway.errors import GatewayAuthError
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
client.require_authentication()
|
|
76
|
+
except GatewayAuthError as exc:
|
|
77
|
+
if getattr(exc, "code", None) == "NO_TOKEN":
|
|
78
|
+
return False
|
|
79
|
+
raise
|
|
80
|
+
return True
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _failure(exc: Exception) -> RpcError:
|
|
84
|
+
"""The Agent's connector errors as RPC conditions (its desktop RPC's reasons)."""
|
|
85
|
+
from tools.connectors.gateway.errors import GatewayAuthError
|
|
86
|
+
|
|
87
|
+
code = getattr(exc, "code", None)
|
|
88
|
+
if isinstance(exc, GatewayAuthError):
|
|
89
|
+
if code in {"no_access", "ORG_ACCESS_DENIED", "forbidden"}:
|
|
90
|
+
return RpcError("This account cannot manage connectors.", condition="connectors_forbidden")
|
|
91
|
+
return RpcError("Sign in to Nous Portal to use connectors.", condition="connectors_sign_in")
|
|
92
|
+
if code == "policy_changed":
|
|
93
|
+
return RpcError("Connector rules changed. Refresh and try again.", condition="policy_conflict")
|
|
94
|
+
if code == "org_required":
|
|
95
|
+
return RpcError("Select an organization to manage connector rules.", condition="connectors_org_required")
|
|
96
|
+
if code in {"forbidden", "no_access"}:
|
|
97
|
+
return RpcError("Connector rules cannot be changed for this account.", condition="connectors_forbidden")
|
|
98
|
+
if code == "invalid_connector_policy" or (code == "HTTP_400" and getattr(exc, "status", None) == 400):
|
|
99
|
+
return RpcError("Connector rule change is invalid.", condition="policy_invalid")
|
|
100
|
+
if code == "connection_not_found":
|
|
101
|
+
return RpcError("Connector account not found.", condition="connection_not_found")
|
|
102
|
+
log.warning("connector request failed: %s", type(exc).__name__)
|
|
103
|
+
return RpcError("Connector request failed.", condition="connectors_failed")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _slug(params: dict, key: str = "connector") -> str:
|
|
107
|
+
raw = params.get(key)
|
|
108
|
+
from tools.connectors.portal.client import validate_slug
|
|
109
|
+
from tools.connectors.portal.errors import InvalidConnectorSlug
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
validate_slug(raw if isinstance(raw, str) else "")
|
|
113
|
+
except InvalidConnectorSlug as exc:
|
|
114
|
+
raise InvalidParams(f"{key} must be a connector slug") from exc
|
|
115
|
+
return raw
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def catalog() -> dict:
|
|
119
|
+
client = _portal()
|
|
120
|
+
if _authenticated(client):
|
|
121
|
+
rows = client.catalog().connectors
|
|
122
|
+
elif callable(public_catalog := getattr(client, "public_catalog", None)):
|
|
123
|
+
rows = public_catalog().connectors
|
|
124
|
+
else:
|
|
125
|
+
raise RpcError("Sign in to Nous Portal to use connectors.", condition="connectors_sign_in")
|
|
126
|
+
return {"connectors": [row.model_dump(mode="json") for row in rows]}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def accounts() -> dict:
|
|
130
|
+
client = _portal()
|
|
131
|
+
if not _authenticated(client):
|
|
132
|
+
return {"accounts": []}
|
|
133
|
+
return {"accounts": [{
|
|
134
|
+
"connection_id": row["connectionId"], "connector": row["connector"], "status": row["status"],
|
|
135
|
+
"status_reason": row.get("statusReason"), "label": row["label"], "alias": row.get("alias"),
|
|
136
|
+
"active": bool(row["active"]), "disabled": bool(row.get("disabled")), "created_at": row["createdAt"],
|
|
137
|
+
} for row in client.list_accounts()]}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def remove(connection_id: str) -> dict:
|
|
141
|
+
removed = _portal(refresh_auth=True).delete_account(connection_id)
|
|
142
|
+
return {"connection_id": removed["connectionId"], "connector": removed["connector"], "status": removed["status"]}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def tools(slug: str, *, refresh: bool) -> dict:
|
|
146
|
+
from tools.connectors.gateway.errors import GatewayUnavailable
|
|
147
|
+
from tools.connectors.portal.tools_cache import read_tools
|
|
148
|
+
|
|
149
|
+
client = _portal()
|
|
150
|
+
client.require_authentication()
|
|
151
|
+
try:
|
|
152
|
+
listing = read_tools(slug, client=client, refresh=refresh)
|
|
153
|
+
except GatewayUnavailable as exc:
|
|
154
|
+
raise RpcError("Connector not found.", condition="connector_not_found") from exc
|
|
155
|
+
keep = ("slug", "name", "description", "facet", "hints", "categories", "deprecated")
|
|
156
|
+
return {"connector": listing.connector, "tools": [{k: v for k, v in tool.model_dump(mode="json").items() if k in keep} for tool in listing.tools]}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def policy() -> dict:
|
|
160
|
+
client = _portal()
|
|
161
|
+
client.require_authentication()
|
|
162
|
+
current = client.policy()
|
|
163
|
+
return {
|
|
164
|
+
"layers": [{"kind": layer.kind, "revision": layer.revision, "body": layer.body.model_dump(mode="json", exclude_none=True)} for layer in current.layers],
|
|
165
|
+
"effective": current.effective.model_dump(mode="json", exclude_none=True, exclude={"version", "issued_at_ms"}),
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def set_policy(connector: str, expected_revision: str, *, enabled: bool | None = None, tool: str | None = None, tool_enabled: bool | None = None) -> dict:
|
|
170
|
+
"""One member-layer change on top of the portal's current member rules: an app on or off, or one of its tools.
|
|
171
|
+
The portal refuses the write when ``expected_revision`` is no longer its member revision."""
|
|
172
|
+
from tools.connectors.portal.policy import InvalidMemberPolicy, compose_connector_write, compose_tools_write
|
|
173
|
+
|
|
174
|
+
client = _portal(refresh_auth=True)
|
|
175
|
+
client.require_authentication()
|
|
176
|
+
member = next((layer.body for layer in client.policy().layers if layer.kind == "member"), None)
|
|
177
|
+
try:
|
|
178
|
+
if tool is None:
|
|
179
|
+
body = compose_connector_write(member, SimpleNamespace(connector=connector, enabled=bool(enabled)))
|
|
180
|
+
else:
|
|
181
|
+
rule = (getattr(member, "tools", None) or {}).get(connector)
|
|
182
|
+
disabled = [name for name in (rule.disable if rule else []) if name != tool] + ([] if tool_enabled else [tool])
|
|
183
|
+
body = compose_tools_write(member, SimpleNamespace(connector=connector, disabled_tools=disabled))
|
|
184
|
+
except InvalidMemberPolicy as exc:
|
|
185
|
+
raise RpcError("Connector rule change is invalid.", condition="policy_invalid") from exc
|
|
186
|
+
body["expectedRevision"] = expected_revision
|
|
187
|
+
return {"revision": client.set_policy(body).revision}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _remember(home: Path, operation) -> None:
|
|
191
|
+
with _OPS_LOCK:
|
|
192
|
+
_OPS[(str(home), operation.op_id)] = operation
|
|
193
|
+
_OPS.move_to_end((str(home), operation.op_id))
|
|
194
|
+
settled = [key for key, op in _OPS.items() if op.settled]
|
|
195
|
+
for key in settled[:max(0, len(_OPS) - _OPS_CAP)]:
|
|
196
|
+
del _OPS[key]
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _operation(home: Path, op_id: str):
|
|
200
|
+
with _OPS_LOCK:
|
|
201
|
+
operation = _OPS.get((str(home), op_id))
|
|
202
|
+
if operation is None:
|
|
203
|
+
raise RpcError("No connection operation with that id.", condition="operation_not_found")
|
|
204
|
+
return operation
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def operation_view(operation) -> dict:
|
|
208
|
+
"""The operation as the sidecar reports it: every target's state, the vendor's text, the authorization link while
|
|
209
|
+
the target waits on it (the Agent keeps a used link on a connected target), and the credentials an MCP install
|
|
210
|
+
still asks for."""
|
|
211
|
+
snapshot = operation.snapshot()
|
|
212
|
+
return {
|
|
213
|
+
"op_id": snapshot["op_id"],
|
|
214
|
+
"settled": snapshot.get("settled_at") is not None,
|
|
215
|
+
# The Connectors page's own operations are account-owned; a chat's carry the tool call that opened the card.
|
|
216
|
+
"owner": "account" if operation.session_key.startswith("account:") else "session",
|
|
217
|
+
"tool_call_id": operation.tool_call_id,
|
|
218
|
+
"targets": [{
|
|
219
|
+
"name": target["name"], "kind": target["kind"], "state": target["state"], "detail": target.get("detail") or "",
|
|
220
|
+
"connect_url": target.get("connect_url") if target["state"] == "initiated" else None,
|
|
221
|
+
"required_env": [{
|
|
222
|
+
"name": str(field.get("name") or ""), "prompt": str(field.get("prompt") or ""), "required": bool(field.get("required")),
|
|
223
|
+
"secret": bool(field.get("secret", True)),
|
|
224
|
+
} for field in target.get("required_env") or [] if isinstance(field, dict) and field.get("name")],
|
|
225
|
+
} for target in snapshot["targets"]],
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def connect(home: Path, connector: str) -> dict:
|
|
230
|
+
"""Start (or rejoin) the account-owned connect for ``connector`` and wait for its authorization link."""
|
|
231
|
+
from tools.connectors import account
|
|
232
|
+
from tools.connectors.contract import TargetState
|
|
233
|
+
from tools.connectors.run import reissue
|
|
234
|
+
|
|
235
|
+
# The gateway attributes each link to who asked; the Agent names its Connectors page ``desktop_page`` (v0.22.0).
|
|
236
|
+
page = {"initiator": "desktop_page"} if "initiator" in inspect.signature(account.find_or_start_operation).parameters else {}
|
|
237
|
+
start = account.find_or_start_operation([connector], action="connect", profile_home=str(home), **page)
|
|
238
|
+
_remember(home, start.operation)
|
|
239
|
+
if not start.started:
|
|
240
|
+
target = start.operation.target(connector)
|
|
241
|
+
if target is not None and target.state in (TargetState.failed, TargetState.expired) and reissue(start.operation, [connector], **page):
|
|
242
|
+
raise RpcError("This connection cannot be started again.", condition="operation_refused")
|
|
243
|
+
return operation_view(start.operation)
|
|
244
|
+
if account.wait_for_prepare(start) and start.failed:
|
|
245
|
+
raise RpcError("Connector request failed.", condition="connectors_failed")
|
|
246
|
+
return operation_view(start.operation)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def respond(home: Path, op_id: str, action: str, target: str | None, env: dict) -> dict:
|
|
250
|
+
"""The card's move: Skip or Retry one target, Approve an MCP install with its credentials, or Continue."""
|
|
251
|
+
from tools.connectors.contract import SettleReason
|
|
252
|
+
from tools.connectors.operation import IllegalTransition
|
|
253
|
+
from tools.connectors.run import apply_answer, reissue
|
|
254
|
+
|
|
255
|
+
operation = _operation(home, op_id)
|
|
256
|
+
if operation.settled:
|
|
257
|
+
raise RpcError("The connection operation has settled.", condition="operation_settled")
|
|
258
|
+
row = operation.target(target) if target else None
|
|
259
|
+
if action != "continue" and row is None:
|
|
260
|
+
raise InvalidParams("target must name a target of the operation")
|
|
261
|
+
try:
|
|
262
|
+
if action == "continue":
|
|
263
|
+
apply_answer(operation, json.dumps({"settled_by": SettleReason.continue_.value}))
|
|
264
|
+
elif action == "retry" and row.kind == "connector":
|
|
265
|
+
if reissue(operation, [row.name]):
|
|
266
|
+
raise RpcError("This target cannot be run again.", condition="operation_refused")
|
|
267
|
+
else:
|
|
268
|
+
status = "skipped" if action == "skip" else "approved"
|
|
269
|
+
apply_answer(operation, json.dumps({"targets": [{"name": row.name, "status": status, "env": env}]}))
|
|
270
|
+
except IllegalTransition as exc:
|
|
271
|
+
# The operation moved between the server's check and this answer (the watcher connected the target meanwhile).
|
|
272
|
+
raise RpcError("That move is no longer open on this connection.", condition="operation_refused") from exc
|
|
273
|
+
operation.settle_if_all_resolved()
|
|
274
|
+
return operation_view(operation)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def remember_chat_operation(home: Path, payload: dict) -> dict | None:
|
|
278
|
+
"""A chat's ``manage_connections`` card opened: keep its operation for the card's reads and moves, and answer the
|
|
279
|
+
frame the turn streams. None when the Agent's registry no longer holds it."""
|
|
280
|
+
from tools.connectors import live
|
|
281
|
+
|
|
282
|
+
op_id = payload.get("op_id") if isinstance(payload, dict) else None
|
|
283
|
+
operation = live.get_by_op_id(op_id, profile_home=str(home)) if isinstance(op_id, str) else None
|
|
284
|
+
if operation is None:
|
|
285
|
+
return None
|
|
286
|
+
_remember(home, operation)
|
|
287
|
+
return operation_view(operation)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def register(registry_) -> None:
|
|
291
|
+
def page(params: dict, read, *, creates_guest: bool = False):
|
|
292
|
+
with scoped_home(profile_home_param(params)):
|
|
293
|
+
_open(creates_guest=creates_guest)
|
|
294
|
+
try:
|
|
295
|
+
return read()
|
|
296
|
+
except RpcError:
|
|
297
|
+
raise
|
|
298
|
+
except Exception as exc: # noqa: BLE001 - the Agent's gateway errors become RPC conditions
|
|
299
|
+
raise _failure(exc) from exc
|
|
300
|
+
|
|
301
|
+
@registry_.method("connectors.available")
|
|
302
|
+
def available_(ctx: CallContext, params: dict) -> dict:
|
|
303
|
+
with scoped_home(profile_home_param(params)):
|
|
304
|
+
return {"available": available()}
|
|
305
|
+
|
|
306
|
+
@registry_.method("connectors.catalog")
|
|
307
|
+
def catalog_(ctx: CallContext, params: dict) -> dict:
|
|
308
|
+
return page(params, catalog)
|
|
309
|
+
|
|
310
|
+
@registry_.method("connectors.accounts")
|
|
311
|
+
def accounts_(ctx: CallContext, params: dict) -> dict:
|
|
312
|
+
return page(params, accounts)
|
|
313
|
+
|
|
314
|
+
@registry_.method("connectors.remove")
|
|
315
|
+
def remove_(ctx: CallContext, params: dict) -> dict:
|
|
316
|
+
connection_id = params.get("connection_id")
|
|
317
|
+
if not isinstance(connection_id, str) or not connection_id:
|
|
318
|
+
raise InvalidParams("connection_id is required")
|
|
319
|
+
return page(params, lambda: remove(connection_id))
|
|
320
|
+
|
|
321
|
+
@registry_.method("connectors.tools")
|
|
322
|
+
def tools_(ctx: CallContext, params: dict) -> dict:
|
|
323
|
+
slug = _slug(params)
|
|
324
|
+
return page(params, lambda: tools(slug, refresh=params.get("refresh") is True))
|
|
325
|
+
|
|
326
|
+
@registry_.method("connectors.policy.get")
|
|
327
|
+
def policy_(ctx: CallContext, params: dict) -> dict:
|
|
328
|
+
return page(params, policy)
|
|
329
|
+
|
|
330
|
+
@registry_.method("connectors.policy.set")
|
|
331
|
+
def set_policy_(ctx: CallContext, params: dict) -> dict:
|
|
332
|
+
slug = _slug(params)
|
|
333
|
+
revision = params.get("expected_revision")
|
|
334
|
+
if not isinstance(revision, str) or not revision:
|
|
335
|
+
raise InvalidParams("expected_revision is required")
|
|
336
|
+
tool = params.get("tool")
|
|
337
|
+
if tool is None:
|
|
338
|
+
if not isinstance(params.get("enabled"), bool):
|
|
339
|
+
raise InvalidParams("enabled is required")
|
|
340
|
+
return page(params, lambda: set_policy(slug, revision, enabled=params["enabled"]))
|
|
341
|
+
if not isinstance(tool, str) or not tool or not isinstance(params.get("tool_enabled"), bool):
|
|
342
|
+
raise InvalidParams("tool and tool_enabled are required together")
|
|
343
|
+
return page(params, lambda: set_policy(slug, revision, tool=tool, tool_enabled=params["tool_enabled"]))
|
|
344
|
+
|
|
345
|
+
@registry_.method("connectors.connect")
|
|
346
|
+
def connect_(ctx: CallContext, params: dict) -> dict:
|
|
347
|
+
slug = _slug(params)
|
|
348
|
+
home = profile_home_param(params)
|
|
349
|
+
return page(params, lambda: connect(home, slug), creates_guest=True)
|
|
350
|
+
|
|
351
|
+
def gated() -> None:
|
|
352
|
+
# Reads and moves on an operation pass the availability gate too, without creating an identity.
|
|
353
|
+
if not available():
|
|
354
|
+
raise RpcError("Connectors are not available.", condition="connectors_unavailable")
|
|
355
|
+
|
|
356
|
+
@registry_.method("connectors.operation")
|
|
357
|
+
def operation_(ctx: CallContext, params: dict) -> dict:
|
|
358
|
+
home = profile_home_param(params)
|
|
359
|
+
with scoped_home(home):
|
|
360
|
+
gated()
|
|
361
|
+
return operation_view(_operation(home, str(params.get("op_id") or "")))
|
|
362
|
+
|
|
363
|
+
@registry_.method("connectors.respond")
|
|
364
|
+
def respond_(ctx: CallContext, params: dict) -> dict:
|
|
365
|
+
home = profile_home_param(params)
|
|
366
|
+
action = params.get("action")
|
|
367
|
+
if action not in ("skip", "retry", "approve", "continue"):
|
|
368
|
+
raise InvalidParams("action must be skip, retry, approve or continue")
|
|
369
|
+
target = params.get("target")
|
|
370
|
+
env = params.get("env") or {}
|
|
371
|
+
if not isinstance(env, dict) or not all(isinstance(k, str) and isinstance(v, str) for k, v in env.items()):
|
|
372
|
+
raise InvalidParams("env must map names to strings")
|
|
373
|
+
with scoped_home(home):
|
|
374
|
+
gated()
|
|
375
|
+
return respond(home, str(params.get("op_id") or ""), action, target if isinstance(target, str) else None, env)
|