@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
|
@@ -4,8 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import base64
|
|
6
6
|
import logging
|
|
7
|
-
import
|
|
7
|
+
import secrets
|
|
8
8
|
import tempfile
|
|
9
|
+
import threading
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
|
|
11
12
|
from ..errors import InvalidParams, RpcError
|
|
@@ -16,85 +17,141 @@ log = logging.getLogger("talaria_sidecar.stt")
|
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
def capability() -> tuple[bool, str]:
|
|
20
|
+
"""The provider the Agent's own resolver would transcribe with, so the client never disagrees with ``stt.transcribe``.
|
|
21
|
+
|
|
22
|
+
``_get_provider`` passes an unknown explicit name through, so availability takes the Agent's
|
|
23
|
+
``check_voice_requirements`` bar: a built-in, a ``stt.providers.<name>`` command, or an available plugin."""
|
|
19
24
|
try:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
is_enabled = getattr(stt, "is_stt_enabled", None)
|
|
28
|
-
if callable(is_enabled) and not is_enabled(stt_config):
|
|
25
|
+
from tools.transcription_tools import (
|
|
26
|
+
BUILTIN_STT_PROVIDERS, _get_provider, _load_stt_config, _resolve_command_stt_provider_config)
|
|
27
|
+
from tools.voice_mode import _check_plugin_stt_provider
|
|
28
|
+
|
|
29
|
+
stt_config = _load_stt_config()
|
|
30
|
+
provider = str(_get_provider(stt_config) or "none")
|
|
31
|
+
if provider == "none":
|
|
29
32
|
return False, "none"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return provider not in ("", "none"), provider or "none"
|
|
35
|
-
|
|
36
|
-
def env(name):
|
|
37
|
-
getter = getattr(stt, "get_env_value", None)
|
|
38
|
-
try:
|
|
39
|
-
if callable(getter):
|
|
40
|
-
return str(getter(name) or "").strip()
|
|
41
|
-
except Exception: # noqa: BLE001
|
|
42
|
-
return ""
|
|
43
|
-
return os.getenv(name, "").strip()
|
|
44
|
-
|
|
45
|
-
def helper(name) -> bool:
|
|
46
|
-
fn = getattr(stt, name, None)
|
|
47
|
-
try:
|
|
48
|
-
return bool(fn()) if callable(fn) else False
|
|
49
|
-
except Exception: # noqa: BLE001
|
|
50
|
-
return False
|
|
51
|
-
|
|
52
|
-
def local_command_available() -> bool:
|
|
53
|
-
return helper("_has_local_command") and helper("_find_ffmpeg_binary")
|
|
54
|
-
|
|
55
|
-
def command_provider_available(provider) -> bool:
|
|
56
|
-
resolver = getattr(stt, "_resolve_command_stt_provider_config", None)
|
|
57
|
-
try:
|
|
58
|
-
return callable(resolver) and resolver(provider, cfg) is not None
|
|
59
|
-
except Exception: # noqa: BLE001
|
|
60
|
-
return False
|
|
61
|
-
|
|
62
|
-
def resolve(provider):
|
|
63
|
-
if provider == "local":
|
|
64
|
-
return "local" if getattr(stt, "_HAS_FASTER_WHISPER", False) else "local_command" if local_command_available() else "none"
|
|
65
|
-
if provider == "local_command":
|
|
66
|
-
return "local_command" if local_command_available() else "local" if getattr(stt, "_HAS_FASTER_WHISPER", False) else "none"
|
|
67
|
-
if provider == "groq":
|
|
68
|
-
return "groq" if getattr(stt, "_HAS_OPENAI", False) and env("GROQ_API_KEY") else "none"
|
|
69
|
-
if provider == "openai":
|
|
70
|
-
return "openai" if getattr(stt, "_HAS_OPENAI", False) and helper("_has_openai_audio_backend") else "none"
|
|
71
|
-
if provider == "mistral":
|
|
72
|
-
return "mistral" if getattr(stt, "_HAS_MISTRAL", False) and env("MISTRAL_API_KEY") else "none"
|
|
73
|
-
if provider == "xai":
|
|
74
|
-
try:
|
|
75
|
-
from tools.xai_http import resolve_xai_http_credentials
|
|
76
|
-
|
|
77
|
-
return "xai" if resolve_xai_http_credentials().get("api_key") else "none"
|
|
78
|
-
except Exception: # noqa: BLE001
|
|
79
|
-
return "none"
|
|
80
|
-
if provider == "elevenlabs":
|
|
81
|
-
return "elevenlabs" if env("ELEVENLABS_API_KEY") else "none"
|
|
82
|
-
return provider if command_provider_available(provider) else "none"
|
|
83
|
-
|
|
84
|
-
if "provider" in cfg:
|
|
85
|
-
configured = str(cfg.get("provider") or "local")
|
|
86
|
-
provider = resolve(configured)
|
|
87
|
-
return provider != "none", provider if provider != "none" else configured
|
|
88
|
-
for candidate in ("local", "local_command", "groq", "openai", "mistral", "xai", "elevenlabs"):
|
|
89
|
-
provider = resolve(candidate)
|
|
90
|
-
if provider != "none":
|
|
91
|
-
return True, provider
|
|
92
|
-
return False, "none"
|
|
93
|
-
except Exception: # noqa: BLE001
|
|
33
|
+
available = (provider in BUILTIN_STT_PROVIDERS
|
|
34
|
+
or _resolve_command_stt_provider_config(provider, stt_config) is not None
|
|
35
|
+
or _check_plugin_stt_provider(provider))
|
|
36
|
+
except Exception: # noqa: BLE001 - an Agent without STT, or a broken STT config
|
|
94
37
|
return False, "none"
|
|
38
|
+
return bool(available), provider
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def streaming_available() -> bool:
|
|
42
|
+
"""``stt.streaming`` is on and the provider has a live wire with credentials (False on an Agent without one)."""
|
|
43
|
+
try:
|
|
44
|
+
from tools.transcription_streaming import streaming_available as agent_streaming_available
|
|
95
45
|
|
|
46
|
+
return bool(agent_streaming_available())
|
|
47
|
+
except Exception: # noqa: BLE001 - an Agent without live STT, or a broken STT config
|
|
48
|
+
return False
|
|
96
49
|
|
|
97
|
-
|
|
50
|
+
|
|
51
|
+
def dictation(transcript: str) -> dict:
|
|
52
|
+
"""The transcript, emptied with ``filtered`` when it is a phrase Whisper invents on silent audio (TAL-917).
|
|
53
|
+
|
|
54
|
+
The Agent's ``transcribe_recording`` filter, without its voice-mode tagging. An Agent without it keeps the text."""
|
|
55
|
+
transcript = transcript.strip()
|
|
56
|
+
try:
|
|
57
|
+
from tools.voice_mode_transcript import is_whisper_hallucination
|
|
58
|
+
except ImportError:
|
|
59
|
+
return {"transcript": transcript, "filtered": False}
|
|
60
|
+
if transcript and is_whisper_hallucination(transcript):
|
|
61
|
+
return {"transcript": "", "filtered": True}
|
|
62
|
+
return {"transcript": transcript, "filtered": False}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _agent_warmer():
|
|
66
|
+
"""The Agent's ``warm_stt_provider``, or None on an Agent without ``tools.stt_lease``."""
|
|
67
|
+
try:
|
|
68
|
+
from tools.stt_lease import warm_stt_provider
|
|
69
|
+
except ImportError:
|
|
70
|
+
return None
|
|
71
|
+
return warm_stt_provider
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def warm() -> dict:
|
|
75
|
+
"""Pre-load the profile's local engine so the next ``stt.transcribe`` starts hot (TAL-916); a no-op for remote providers.
|
|
76
|
+
|
|
77
|
+
Blocking: a first use downloads and loads the model. The Agent's warmer never raises."""
|
|
78
|
+
warmer = _agent_warmer()
|
|
79
|
+
if warmer is None:
|
|
80
|
+
return {"provider": capability()[1], "warmed": False, "action": "unsupported"}
|
|
81
|
+
result = warmer()
|
|
82
|
+
out = {"provider": str(result.get("provider") or "none"), "warmed": bool(result.get("warmed")), "action": str(result.get("action") or "noop")}
|
|
83
|
+
if result.get("error"):
|
|
84
|
+
out["error"] = str(result["error"])
|
|
85
|
+
return out
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# Open live sessions by stream id: the ``stt.stream`` call owns each entry and removes it on every exit.
|
|
89
|
+
_STREAMS: dict[str, tuple[object, threading.Event]] = {}
|
|
90
|
+
_STREAMS_LOCK = threading.Lock()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def open_stream(ctx: CallContext):
|
|
94
|
+
"""The profile's live session relaying partials as ``partial`` frames, or None (run under the profile's home).
|
|
95
|
+
|
|
96
|
+
``capability`` first, so a plugin provider is discovered before the session opens."""
|
|
97
|
+
available, _ = capability()
|
|
98
|
+
if not (available and streaming_available()):
|
|
99
|
+
return None
|
|
100
|
+
from tools.transcription_streaming import open_streaming_session
|
|
101
|
+
|
|
102
|
+
return open_streaming_session(on_partial=lambda text: ctx.emit("partial", {"text": text}))
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def run_stream(ctx: CallContext, session, sample_rate: int) -> dict:
|
|
106
|
+
"""Announce the session's id, wait for ``stt.stream_audio`` to end the audio, and return its final transcript.
|
|
107
|
+
|
|
108
|
+
The session's worker keeps the opener's profile context; every exit other than a final cancels it."""
|
|
109
|
+
ended = threading.Event()
|
|
110
|
+
stream_id = secrets.token_urlsafe(16)
|
|
111
|
+
with _STREAMS_LOCK:
|
|
112
|
+
_STREAMS[stream_id] = (session, ended)
|
|
113
|
+
try:
|
|
114
|
+
session.set_input_rate(sample_rate)
|
|
115
|
+
ctx.emit("ready", {"stream_id": stream_id})
|
|
116
|
+
while not ended.wait(0.1):
|
|
117
|
+
ctx.check_cancelled()
|
|
118
|
+
# Finalize off this thread so a cancel still reaches the session while the provider flushes.
|
|
119
|
+
finalized: dict = {}
|
|
120
|
+
finalizer = threading.Thread(target=lambda: finalized.update(result=session.finalize()), name="stt-stream-finalize", daemon=True)
|
|
121
|
+
finalizer.start()
|
|
122
|
+
while finalizer.is_alive():
|
|
123
|
+
finalizer.join(0.1)
|
|
124
|
+
ctx.check_cancelled()
|
|
125
|
+
result = finalized.get("result")
|
|
126
|
+
except BaseException:
|
|
127
|
+
session.cancel()
|
|
128
|
+
raise
|
|
129
|
+
finally:
|
|
130
|
+
with _STREAMS_LOCK:
|
|
131
|
+
_STREAMS.pop(stream_id, None)
|
|
132
|
+
if not isinstance(result, dict) or not result.get("success"):
|
|
133
|
+
message = str(result.get("error") or "") if isinstance(result, dict) else ""
|
|
134
|
+
raise RpcError(message or "Live transcription failed", condition="stt_failed")
|
|
135
|
+
return {**dictation(str(result.get("transcript") or "")), "provider": str(result.get("provider") or "")}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def stream_audio(stream_id: str, audio_b64: str, end: bool) -> dict:
|
|
139
|
+
with _STREAMS_LOCK:
|
|
140
|
+
entry = _STREAMS.get(stream_id)
|
|
141
|
+
if entry is None:
|
|
142
|
+
raise RpcError("Live transcription stream is closed", condition="stt_stream_closed")
|
|
143
|
+
session, ended = entry
|
|
144
|
+
if audio_b64:
|
|
145
|
+
try:
|
|
146
|
+
session.push_audio(base64.b64decode(audio_b64, validate=True))
|
|
147
|
+
except ValueError as exc:
|
|
148
|
+
raise InvalidParams("audio must be base64") from exc
|
|
149
|
+
if end:
|
|
150
|
+
ended.set()
|
|
151
|
+
return {"ok": True}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def transcribe(audio_b64: str, suffix: str) -> dict:
|
|
98
155
|
try:
|
|
99
156
|
from tools.transcription_tools import transcribe_audio
|
|
100
157
|
except ImportError as exc:
|
|
@@ -115,7 +172,7 @@ def transcribe(audio_b64: str, suffix: str) -> str:
|
|
|
115
172
|
message = str((result or {}).get("error") or "Transcription failed") if isinstance(result, dict) else "Transcription failed"
|
|
116
173
|
lowered = message.lower()
|
|
117
174
|
raise RpcError(message, condition="stt_unavailable" if "unavailable" in lowered or "not configured" in lowered else "stt_failed")
|
|
118
|
-
return str(result.get("transcript") or "")
|
|
175
|
+
return dictation(str(result.get("transcript") or ""))
|
|
119
176
|
|
|
120
177
|
|
|
121
178
|
def register(registry) -> None:
|
|
@@ -123,9 +180,33 @@ def register(registry) -> None:
|
|
|
123
180
|
def capability_(ctx: CallContext, params: dict) -> dict:
|
|
124
181
|
with scoped_home(profile_home_param(params)):
|
|
125
182
|
available, provider = capability()
|
|
126
|
-
|
|
183
|
+
streaming = available and streaming_available()
|
|
184
|
+
# Only the local engine has anything resident to load; the Agent's warmer no-ops every other provider.
|
|
185
|
+
warm_supported = bool(available) and provider == "local" and _agent_warmer() is not None
|
|
186
|
+
return {"available": bool(available), "provider": provider, "streaming": bool(streaming), "warm_supported": warm_supported}
|
|
187
|
+
|
|
188
|
+
@registry.method("stt.warm")
|
|
189
|
+
def warm_(ctx: CallContext, params: dict) -> dict:
|
|
190
|
+
with scoped_home(profile_home_param(params)):
|
|
191
|
+
return warm()
|
|
127
192
|
|
|
128
193
|
@registry.method("stt.transcribe")
|
|
129
194
|
def transcribe_(ctx: CallContext, params: dict) -> dict:
|
|
130
195
|
with scoped_home(profile_home_param(params)):
|
|
131
|
-
return
|
|
196
|
+
return transcribe(str(params.get("audio_b64") or ""), str(params.get("suffix") or ".webm"))
|
|
197
|
+
|
|
198
|
+
@registry.method("stt.stream")
|
|
199
|
+
def stream_(ctx: CallContext, params: dict) -> dict:
|
|
200
|
+
sample_rate = params.get("sample_rate")
|
|
201
|
+
if not isinstance(sample_rate, int) or not 8000 <= sample_rate <= 48000:
|
|
202
|
+
raise InvalidParams("sample_rate must be an integer from 8000 to 48000")
|
|
203
|
+
# Open under the profile's home, then wait outside it: the scope is not held for the whole dictation.
|
|
204
|
+
with scoped_home(profile_home_param(params)):
|
|
205
|
+
session = open_stream(ctx)
|
|
206
|
+
if session is None:
|
|
207
|
+
raise RpcError("Live transcription is unavailable for the configured provider", condition="stt_stream_unavailable")
|
|
208
|
+
return run_stream(ctx, session, sample_rate)
|
|
209
|
+
|
|
210
|
+
@registry.method("stt.stream_audio")
|
|
211
|
+
def stream_audio_(ctx: CallContext, params: dict) -> dict:
|
|
212
|
+
return stream_audio(str(params.get("stream_id") or ""), str(params.get("audio_b64") or ""), bool(params.get("end")))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""``text.*``: pure helpers from the Agent that the server must match exactly
|
|
2
|
-
(image input routing, portal tags)."""
|
|
2
|
+
(image input routing, portal tags, spoken text)."""
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
@@ -65,6 +65,15 @@ def portal_tags() -> dict:
|
|
|
65
65
|
return out
|
|
66
66
|
|
|
67
67
|
|
|
68
|
+
def spoken(text: str) -> dict:
|
|
69
|
+
"""TAL-906: the Agent's read-aloud script for ``text``; the text as written on an Agent without the normalizer."""
|
|
70
|
+
try:
|
|
71
|
+
from tools.tts_text_normalize import prepare_spoken_text
|
|
72
|
+
except Exception: # noqa: BLE001
|
|
73
|
+
return {"spoken_text": text}
|
|
74
|
+
return {"spoken_text": prepare_spoken_text(text)}
|
|
75
|
+
|
|
76
|
+
|
|
68
77
|
def register(registry) -> None:
|
|
69
78
|
@registry.method("text.image_mode")
|
|
70
79
|
def image_mode_(ctx: CallContext, params: dict) -> dict:
|
|
@@ -80,3 +89,7 @@ def register(registry) -> None:
|
|
|
80
89
|
def tags(ctx: CallContext, params: dict) -> dict:
|
|
81
90
|
with scoped_home(profile_home_param(params)):
|
|
82
91
|
return portal_tags()
|
|
92
|
+
|
|
93
|
+
@registry.method("text.spoken")
|
|
94
|
+
def spoken_(ctx: CallContext, params: dict) -> dict:
|
|
95
|
+
return spoken(str(params.get("text") or ""))
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Profile toolset policy and catalog. All callers run under ``scoped_home``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from ..home import profile_home_param, scoped_home
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def disabled_toolsets(cfg: dict | None = None) -> list[str]:
|
|
9
|
+
from agent.skill_utils import parse_config_string_list
|
|
10
|
+
from hermes_cli.config import load_config
|
|
11
|
+
|
|
12
|
+
section = ((load_config() or {}) if cfg is None else cfg).get('agent') or {}
|
|
13
|
+
return [name.strip() for name in parse_config_string_list(section.get('disabled_toolsets')) if name.strip()]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def catalog(override) -> dict:
|
|
17
|
+
from hermes_cli.plugins import discover_plugins
|
|
18
|
+
from model_tools import get_tool_definitions
|
|
19
|
+
import toolsets
|
|
20
|
+
from toolsets import get_all_toolsets, resolve_toolset
|
|
21
|
+
from .chat import _profile_toolsets
|
|
22
|
+
from .commands import discover_profile_mcp_tools
|
|
23
|
+
|
|
24
|
+
discover_plugins()
|
|
25
|
+
discover_profile_mcp_tools()
|
|
26
|
+
definitions = get_all_toolsets()
|
|
27
|
+
disabled = disabled_toolsets()
|
|
28
|
+
platform_policy = getattr(toolsets, "session_disabled_toolsets", None)
|
|
29
|
+
effective_disabled = platform_policy(disabled, "webui") if platform_policy else disabled
|
|
30
|
+
selected = _profile_toolsets() if override is None else list(dict.fromkeys(override))
|
|
31
|
+
# Resolve once through the same Agent filter used at execution, before deferred-tool assembly.
|
|
32
|
+
tools = {item['function']['name'] for item in get_tool_definitions(
|
|
33
|
+
enabled_toolsets=list(definitions), disabled_toolsets=effective_disabled,
|
|
34
|
+
quiet_mode=True, skip_tool_search_assembly=True,
|
|
35
|
+
)}
|
|
36
|
+
rows = []
|
|
37
|
+
for name in sorted(set(definitions) | set(selected)):
|
|
38
|
+
available = name in definitions and name not in disabled and bool(set(resolve_toolset(name)) & tools)
|
|
39
|
+
rows.append({
|
|
40
|
+
'name': name, 'description': str(definitions.get(name, {}).get('description') or ''),
|
|
41
|
+
'available': available, 'selected': name in selected,
|
|
42
|
+
'unavailable_reason': None if available else 'disabled' if name in disabled else 'unavailable',
|
|
43
|
+
})
|
|
44
|
+
return {'toolsets': rows, 'selected_toolsets': selected, 'using_defaults': override is None}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def register(registry) -> None:
|
|
48
|
+
@registry.method('toolsets.catalog')
|
|
49
|
+
def catalog_(ctx, params):
|
|
50
|
+
with scoped_home(profile_home_param(params)):
|
|
51
|
+
return catalog(params.get('enabled_toolsets'))
|
|
@@ -4,9 +4,14 @@ state, and the key-based balance endpoints (TAL-548). Pool keys never leave the
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
6
|
import dataclasses
|
|
7
|
+
import functools
|
|
8
|
+
import hashlib
|
|
9
|
+
import hmac
|
|
10
|
+
import inspect
|
|
7
11
|
import json
|
|
8
12
|
import logging
|
|
9
13
|
import math
|
|
14
|
+
import secrets
|
|
10
15
|
import time
|
|
11
16
|
import urllib.error
|
|
12
17
|
import urllib.request
|
|
@@ -18,6 +23,7 @@ from ..home import profile_home_param, scoped_home
|
|
|
18
23
|
from ..rpc import CallContext
|
|
19
24
|
|
|
20
25
|
log = logging.getLogger("talaria_sidecar.usage")
|
|
26
|
+
_KEY_REVISION_SALT = secrets.token_bytes(32)
|
|
21
27
|
|
|
22
28
|
|
|
23
29
|
def _plain(value: Any) -> Any:
|
|
@@ -102,11 +108,36 @@ def _label(entry, index: int) -> str:
|
|
|
102
108
|
return label[:61].rstrip() + "..." if len(label) > 64 else label
|
|
103
109
|
|
|
104
110
|
|
|
111
|
+
def _usable_key(value: Any) -> str:
|
|
112
|
+
key = str(value or "").strip()
|
|
113
|
+
return "" if key.startswith("op://") else key
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _configured_key(api_key: str | None, env_vars: list[str] | None) -> str:
|
|
117
|
+
"""Called only inside scoped_home: prefer an explicit key, else let the Agent resolve its secret sources."""
|
|
118
|
+
if api_key:
|
|
119
|
+
return _usable_key(api_key)
|
|
120
|
+
if not env_vars:
|
|
121
|
+
return ""
|
|
122
|
+
try:
|
|
123
|
+
from hermes_cli.config import get_env_value_prefer_dotenv as get_env
|
|
124
|
+
except ImportError: # older Agents still resolve through the installed profile secret scope
|
|
125
|
+
try:
|
|
126
|
+
from agent.secret_scope import get_secret as get_env
|
|
127
|
+
except ImportError:
|
|
128
|
+
return ""
|
|
129
|
+
for name in env_vars or []:
|
|
130
|
+
key = _usable_key(get_env(name))
|
|
131
|
+
if key:
|
|
132
|
+
return key
|
|
133
|
+
return ""
|
|
134
|
+
|
|
135
|
+
|
|
105
136
|
def pool(provider: str, *, api_key: str | None = None) -> list[dict]:
|
|
106
137
|
"""Python `_local_pool_snapshot` rows: one per pool entry with an id, its local status, whether it holds the
|
|
107
|
-
|
|
138
|
+
profile-resolved configured key, and no secrets."""
|
|
108
139
|
agent_pool, entries = _pool(provider)
|
|
109
|
-
configured =
|
|
140
|
+
configured = _usable_key(api_key)
|
|
110
141
|
try:
|
|
111
142
|
from agent.credential_pool import _exhausted_until
|
|
112
143
|
except Exception: # noqa: BLE001 - an Agent without it cannot date an exhausted mark, so the entry reads as available
|
|
@@ -134,6 +165,40 @@ def pool(provider: str, *, api_key: str | None = None) -> list[dict]:
|
|
|
134
165
|
return rows
|
|
135
166
|
|
|
136
167
|
|
|
168
|
+
def limits(providers: list[dict]) -> dict[str, dict]:
|
|
169
|
+
"""TAL-807: the Agent's ``CredentialPool.limit_state`` per pooled provider, ISO-dated, as its ``model.options`` attaches
|
|
170
|
+
``limit``: ``account`` when every live entry is benched, else ``models`` for the given models no usable entry can serve
|
|
171
|
+
yet. A provider without a persisted pool, an unreadable pool, or an Agent before v0.21.6 says nothing."""
|
|
172
|
+
try:
|
|
173
|
+
from agent.credential_pool import load_pool
|
|
174
|
+
from hermes_cli.auth import read_credential_pool
|
|
175
|
+
except Exception as exc: # noqa: BLE001
|
|
176
|
+
raise RpcError(f"credential pool unavailable: {exc}", condition="usage_unavailable") from exc
|
|
177
|
+
try:
|
|
178
|
+
pooled = {str(slug) for slug, entries in (read_credential_pool() or {}).items() if entries}
|
|
179
|
+
except Exception: # noqa: BLE001
|
|
180
|
+
log.debug("read_credential_pool() failed", exc_info=True)
|
|
181
|
+
return {}
|
|
182
|
+
out: dict[str, dict] = {}
|
|
183
|
+
for row in providers:
|
|
184
|
+
slug = str(row.get("slug") or "").strip()
|
|
185
|
+
if slug not in pooled:
|
|
186
|
+
continue
|
|
187
|
+
try:
|
|
188
|
+
limit_state = getattr(load_pool(slug), "limit_state", None)
|
|
189
|
+
state = limit_state([str(m) for m in row.get("models") or []]) if callable(limit_state) else None
|
|
190
|
+
except Exception: # noqa: BLE001 - one unreadable pool must not hide the others
|
|
191
|
+
log.debug("limit_state(%r) failed", slug, exc_info=True)
|
|
192
|
+
continue
|
|
193
|
+
if not state:
|
|
194
|
+
continue
|
|
195
|
+
if state.get("scope") == "account":
|
|
196
|
+
out[slug] = {"scope": "account", "resets_at": _iso(state["resets_at"])}
|
|
197
|
+
elif state.get("models"):
|
|
198
|
+
out[slug] = {"scope": "models", "models": {str(m): _iso(at) for m, at in state["models"].items()}}
|
|
199
|
+
return out
|
|
200
|
+
|
|
201
|
+
|
|
137
202
|
_BALANCE_URLS = {
|
|
138
203
|
"openrouter": "https://openrouter.ai/api/v1/key",
|
|
139
204
|
"deepseek": "https://api.deepseek.com/user/balance",
|
|
@@ -204,13 +269,15 @@ def _opencode_go(payload: Any) -> dict | None:
|
|
|
204
269
|
_BALANCE_PARSERS = {"openrouter": _openrouter, "deepseek": _deepseek, "opencode-go": _opencode_go}
|
|
205
270
|
|
|
206
271
|
|
|
207
|
-
def balance(provider: str, *, credential_id: str | None, api_key: str | None) -> dict:
|
|
208
|
-
"""One key-based balance read. A pool credential's key resolves here; otherwise the
|
|
272
|
+
def balance(provider: str, *, credential_id: str | None, api_key: str | None, env_vars: list[str] | None = None) -> dict:
|
|
273
|
+
"""One key-based balance read. A pool credential's key resolves here; otherwise resolve the configured key inside the profile scope."""
|
|
209
274
|
result = {"status": "unavailable", "http_status": None, "quota": None, "label": None, "is_available": None, "balances": [], "windows": []}
|
|
210
|
-
key =
|
|
275
|
+
key = ""
|
|
211
276
|
if credential_id:
|
|
212
277
|
entry = _entry(provider, credential_id)
|
|
213
|
-
key = _entry_key(entry) if entry is not None else ""
|
|
278
|
+
key = _usable_key(_entry_key(entry)) if entry is not None else ""
|
|
279
|
+
else:
|
|
280
|
+
key = _configured_key(api_key, env_vars)
|
|
214
281
|
if not key:
|
|
215
282
|
return {**result, "status": "no_key"}
|
|
216
283
|
request = urllib.request.Request(_BALANCE_URLS[provider], headers={"Authorization": f"Bearer {key}", "Accept": "application/json", "User-Agent": "Talaria-Web/1.0"})
|
|
@@ -232,10 +299,10 @@ _ANTHROPIC_WINDOWS = (("five_hour", "Current session"), ("seven_day", "Current w
|
|
|
232
299
|
|
|
233
300
|
|
|
234
301
|
def _anthropic_usage(token: str):
|
|
235
|
-
"""The Agent's Anthropic account-usage read for one given token.
|
|
236
|
-
pool account would otherwise report the active account's limits."""
|
|
237
|
-
# ponytail: mirrors agent.account_usage._fetch_anthropic_account_usage on the Agent's own helpers;
|
|
238
|
-
#
|
|
302
|
+
"""The Agent's Anthropic account-usage read for one given token. An Agent before v0.21.6 reads only the ambient token,
|
|
303
|
+
so a pool account would otherwise report the active account's limits."""
|
|
304
|
+
# ponytail: mirrors agent.account_usage._fetch_anthropic_account_usage on the Agent's own helpers; TAL-351 drops it
|
|
305
|
+
# once v0.21.6 is the oldest supported Agent.
|
|
239
306
|
from agent import account_usage as agent_usage
|
|
240
307
|
|
|
241
308
|
if not agent_usage._is_oauth_token(token):
|
|
@@ -250,7 +317,18 @@ def _anthropic_usage(token: str):
|
|
|
250
317
|
return agent_usage._snapshot("anthropic", "oauth_usage_api", windows, details)
|
|
251
318
|
|
|
252
319
|
|
|
320
|
+
@functools.cache
|
|
321
|
+
def _reads_read_only(fetch) -> bool:
|
|
322
|
+
"""Agent v0.21.6+: ``fetch_account_usage(read_only=, identity_id=)`` reads one pool account without refreshing or
|
|
323
|
+
rotating its credential, and every fetcher honours the explicit key. TAL-351 drops the check with the mirror."""
|
|
324
|
+
try:
|
|
325
|
+
return {"read_only", "identity_id"} <= inspect.signature(fetch).parameters.keys()
|
|
326
|
+
except (TypeError, ValueError):
|
|
327
|
+
return False
|
|
328
|
+
|
|
329
|
+
|
|
253
330
|
def account(provider: str, *, base_url: str | None, api_key: str | None, credential_id: str | None = None) -> dict | None:
|
|
331
|
+
entry = None
|
|
254
332
|
if credential_id:
|
|
255
333
|
# One pool account's usage, read with that account's own key.
|
|
256
334
|
entry = _entry(provider, credential_id)
|
|
@@ -265,7 +343,12 @@ def account(provider: str, *, base_url: str | None, api_key: str | None, credent
|
|
|
265
343
|
except Exception as exc: # noqa: BLE001
|
|
266
344
|
raise RpcError(f"account usage unavailable: {exc}", condition="usage_unavailable") from exc
|
|
267
345
|
try:
|
|
268
|
-
if
|
|
346
|
+
if entry is not None and _reads_read_only(fetch_account_usage):
|
|
347
|
+
# A display read never repairs the account: a rejected key reads as unavailable, never as a credential refresh.
|
|
348
|
+
from agent.account_usage_cache import _identity_id_for
|
|
349
|
+
|
|
350
|
+
snapshot = fetch_account_usage(provider, base_url=base_url, api_key=api_key, read_only=True, identity_id=_identity_id_for(provider, entry))
|
|
351
|
+
elif entry is not None and provider == "anthropic":
|
|
269
352
|
snapshot = _anthropic_usage(api_key)
|
|
270
353
|
else:
|
|
271
354
|
snapshot = fetch_account_usage(provider, base_url=base_url, api_key=api_key)
|
|
@@ -301,12 +384,28 @@ def register(registry) -> None:
|
|
|
301
384
|
if not provider:
|
|
302
385
|
raise InvalidParams("provider is required")
|
|
303
386
|
with scoped_home(profile_home_param(params)):
|
|
304
|
-
|
|
387
|
+
key = _configured_key(params.get("api_key"), params.get("env_vars"))
|
|
388
|
+
return {"entries": pool(provider, api_key=key), "has_api_key": bool(key)}
|
|
305
389
|
|
|
306
390
|
@registry.method("usage.pool_providers")
|
|
307
391
|
def pool_providers_(ctx: CallContext, params: dict) -> dict:
|
|
392
|
+
key_envs = params.get("key_envs") or {}
|
|
393
|
+
if not isinstance(key_envs, dict) or not all(isinstance(pid, str) and isinstance(names, list) and all(isinstance(name, str) for name in names) for pid, names in key_envs.items()):
|
|
394
|
+
raise InvalidParams("key_envs must map providers to environment variable names")
|
|
395
|
+
with scoped_home(profile_home_param(params)):
|
|
396
|
+
keys = {}
|
|
397
|
+
for provider, names in key_envs.items():
|
|
398
|
+
key = _configured_key(None, names)
|
|
399
|
+
keys[provider] = {"present": bool(key), "revision": hmac.new(_KEY_REVISION_SALT, key.encode(), hashlib.sha256).hexdigest() if key else None}
|
|
400
|
+
return {"providers": pool_providers(), "keys": keys}
|
|
401
|
+
|
|
402
|
+
@registry.method("usage.limits")
|
|
403
|
+
def limits_(ctx: CallContext, params: dict) -> dict:
|
|
404
|
+
providers = params.get("providers")
|
|
405
|
+
if not isinstance(providers, list) or not all(isinstance(p, dict) for p in providers):
|
|
406
|
+
raise InvalidParams("providers must be a list of {slug, models}")
|
|
308
407
|
with scoped_home(profile_home_param(params)):
|
|
309
|
-
return {"
|
|
408
|
+
return {"limits": limits(providers)}
|
|
310
409
|
|
|
311
410
|
@registry.method("usage.balance")
|
|
312
411
|
def balance_(ctx: CallContext, params: dict) -> dict:
|
|
@@ -315,4 +414,4 @@ def register(registry) -> None:
|
|
|
315
414
|
raise InvalidParams(f"provider must be one of {sorted(_BALANCE_URLS)}")
|
|
316
415
|
credential_id = str(params.get("credential_id") or "").strip() or None
|
|
317
416
|
with scoped_home(profile_home_param(params)):
|
|
318
|
-
return balance(provider, credential_id=credential_id, api_key=params.get("api_key"))
|
|
417
|
+
return balance(provider, credential_id=credential_id, api_key=params.get("api_key"), env_vars=params.get("env_vars"))
|