@maudecode/talaria-web 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_release.json +8 -8
- package/dist/api/auth-raw.js +16 -16
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +2 -2
- package/dist/api/automation-raw.js +93 -38
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +99 -17
- package/dist/api/automation-router.js +22 -14
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1433 -37
- package/dist/api/chat-router.js +205 -90
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +6 -2
- package/dist/api/git-router.js +30 -30
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +3 -3
- package/dist/api/raw-routes.js +76 -62
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +5 -5
- package/dist/api/router.js +22 -22
- package/dist/api/router.js.map +1 -1
- package/dist/api/session-visibility.d.ts +4 -4
- package/dist/api/session-visibility.js +26 -16
- package/dist/api/session-visibility.js.map +1 -1
- package/dist/api/sessions-router.d.ts +2635 -151
- package/dist/api/sessions-router.js +193 -177
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +450 -11
- package/dist/api/settings-router.js +102 -49
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +2 -2
- package/dist/api/sse-routes.js +102 -80
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +58 -33
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +963 -109
- package/dist/api/tools-router.js +426 -72
- package/dist/api/tools-router.js.map +1 -1
- package/dist/api/transcribe-stream.d.ts +16 -0
- package/dist/api/transcribe-stream.js +172 -0
- package/dist/api/transcribe-stream.js.map +1 -0
- package/dist/app.d.ts +4 -1
- package/dist/app.js +80 -57
- package/dist/app.js.map +1 -1
- package/dist/auth/crypto.d.ts +3 -0
- package/dist/auth/crypto.js +18 -0
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/gate.js +14 -9
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/passkeys.d.ts +15 -14
- package/dist/auth/passkeys.js +89 -91
- package/dist/auth/passkeys.js.map +1 -1
- package/dist/auth/store.d.ts +17 -7
- package/dist/auth/store.js +93 -52
- package/dist/auth/store.js.map +1 -1
- package/dist/bin/talaria-web.js +12 -81
- package/dist/bin/talaria-web.js.map +1 -1
- package/dist/cli/ctl.js +8 -2
- package/dist/cli/ctl.js.map +1 -1
- package/dist/cli/dotenv.d.ts +5 -0
- package/dist/cli/dotenv.js +14 -2
- package/dist/cli/dotenv.js.map +1 -1
- package/dist/cli/launcher.js +5 -5
- package/dist/cli/launcher.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +90 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/supervise.d.ts +24 -0
- package/dist/cli/supervise.js +147 -6
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +37 -11
- package/dist/config/agent-config.js +146 -64
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +14 -5
- package/dist/config.js.map +1 -1
- package/dist/fs/atomic.d.ts +4 -0
- package/dist/fs/atomic.js +19 -2
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +7 -0
- package/dist/fs/stat.js +27 -0
- package/dist/fs/stat.js.map +1 -0
- package/dist/http/context.d.ts +28 -9
- package/dist/http/context.js +77 -25
- package/dist/http/context.js.map +1 -1
- package/dist/onboarding.d.ts +2 -2
- package/dist/onboarding.js +10 -8
- package/dist/onboarding.js.map +1 -1
- package/dist/profiles/profiles.d.ts +12 -4
- package/dist/profiles/profiles.js +78 -30
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/projects.d.ts +15 -6
- package/dist/projects.js +55 -47
- package/dist/projects.js.map +1 -1
- package/dist/providers/catalog.d.ts +85 -14
- package/dist/providers/catalog.js +502 -146
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/env-file.d.ts +10 -3
- package/dist/providers/env-file.js +24 -75
- package/dist/providers/env-file.js.map +1 -1
- package/dist/providers/runtime-env.d.ts +4 -2
- package/dist/providers/runtime-env.js +9 -6
- package/dist/providers/runtime-env.js.map +1 -1
- package/dist/providers/tables.d.ts +3 -1
- package/dist/providers/tables.js +4 -2
- package/dist/providers/tables.js.map +1 -1
- package/dist/redact.js +56 -23
- package/dist/redact.js.map +1 -1
- package/dist/release.d.ts +7 -0
- package/dist/release.js +19 -3
- package/dist/release.js.map +1 -1
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.js +303 -96
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +31 -18
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +11 -4
- package/dist/sessions/anchor.js +33 -37
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-events.d.ts +2 -0
- package/dist/sessions/background-events.js +10 -0
- package/dist/sessions/background-events.js.map +1 -0
- package/dist/sessions/background-tasks.d.ts +49 -23
- package/dist/sessions/background-tasks.js +161 -89
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/background-updates.d.ts +15 -8
- package/dist/sessions/background-updates.js +101 -25
- package/dist/sessions/background-updates.js.map +1 -1
- package/dist/sessions/cli-sessions.d.ts +23 -6
- package/dist/sessions/cli-sessions.js +84 -84
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +38 -2
- package/dist/sessions/completions.js +348 -77
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +8 -0
- package/dist/sessions/compress.js +2 -2
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/drafts.d.ts +14 -10
- package/dist/sessions/drafts.js +38 -43
- package/dist/sessions/drafts.js.map +1 -1
- package/dist/sessions/export.d.ts +2 -0
- package/dist/sessions/export.js +6 -2
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +86 -0
- package/dist/sessions/gateway-sessions.js +914 -0
- package/dist/sessions/gateway-sessions.js.map +1 -0
- package/dist/sessions/gateway-watcher.d.ts +10 -11
- package/dist/sessions/gateway-watcher.js +25 -21
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/goals.d.ts +31 -0
- package/dist/sessions/goals.js +75 -0
- package/dist/sessions/goals.js.map +1 -0
- package/dist/sessions/journal.d.ts +5 -79
- package/dist/sessions/journal.js +15 -606
- package/dist/sessions/journal.js.map +1 -1
- package/dist/sessions/list.d.ts +34 -18
- package/dist/sessions/list.js +161 -147
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +77 -13
- package/dist/sessions/merge.js +315 -65
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/notices.d.ts +22 -0
- package/dist/sessions/notices.js +72 -0
- package/dist/sessions/notices.js.map +1 -0
- package/dist/sessions/pending.d.ts +10 -4
- package/dist/sessions/pending.js +83 -7
- package/dist/sessions/pending.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +85 -0
- package/dist/sessions/prefix-index.js +243 -0
- package/dist/sessions/prefix-index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +4 -7
- package/dist/sessions/recovery.js +100 -283
- package/dist/sessions/recovery.js.map +1 -1
- package/dist/sessions/relay.d.ts +20 -20
- package/dist/sessions/relay.js +205 -127
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +251 -78
- package/dist/sessions/service.js +1510 -564
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +20 -2
- package/dist/sessions/session.js +33 -5
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/shares.d.ts +7 -6
- package/dist/sessions/shares.js +22 -45
- package/dist/sessions/shares.js.map +1 -1
- package/dist/sessions/source-kind.js +1 -0
- package/dist/sessions/source-kind.js.map +1 -1
- package/dist/sessions/state-db-identity.d.ts +18 -0
- package/dist/sessions/state-db-identity.js +67 -0
- package/dist/sessions/state-db-identity.js.map +1 -0
- package/dist/sessions/state-db-worker.js +24 -5
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +157 -21
- package/dist/sessions/state-db.js +1145 -204
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/state-saved.d.ts +1 -1
- package/dist/sessions/state-saved.js +35 -11
- package/dist/sessions/state-saved.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +171 -0
- package/dist/sessions/storage/backend.js +19 -0
- package/dist/sessions/storage/backend.js.map +1 -0
- package/dist/sessions/storage/conformance.d.ts +20 -0
- package/dist/sessions/storage/conformance.js +237 -0
- package/dist/sessions/storage/conformance.js.map +1 -0
- package/dist/sessions/storage/document.d.ts +16 -0
- package/dist/sessions/storage/document.js +44 -0
- package/dist/sessions/storage/document.js.map +1 -0
- package/dist/sessions/storage/json-documents.d.ts +25 -0
- package/dist/sessions/storage/json-documents.js +277 -0
- package/dist/sessions/storage/json-documents.js.map +1 -0
- package/dist/sessions/storage/json-files.d.ts +23 -0
- package/dist/sessions/storage/json-files.js +244 -0
- package/dist/sessions/storage/json-files.js.map +1 -0
- package/dist/sessions/storage/json-installation.d.ts +3 -0
- package/dist/sessions/storage/json-installation.js +31 -0
- package/dist/sessions/storage/json-installation.js.map +1 -0
- package/dist/sessions/storage/json-journal.d.ts +113 -0
- package/dist/sessions/storage/json-journal.js +756 -0
- package/dist/sessions/storage/json-journal.js.map +1 -0
- package/dist/sessions/storage/json-recovery.d.ts +4 -0
- package/dist/sessions/storage/json-recovery.js +195 -0
- package/dist/sessions/storage/json-recovery.js.map +1 -0
- package/dist/sessions/storage/json.d.ts +82 -0
- package/dist/sessions/storage/json.js +350 -0
- package/dist/sessions/storage/json.js.map +1 -0
- package/dist/sessions/storage/row.d.ts +6 -0
- package/dist/sessions/storage/row.js +49 -0
- package/dist/sessions/storage/row.js.map +1 -0
- package/dist/sessions/storage/search-text.d.ts +4 -0
- package/dist/sessions/storage/search-text.js +16 -0
- package/dist/sessions/storage/search-text.js.map +1 -0
- package/dist/sessions/store.d.ts +67 -73
- package/dist/sessions/store.js +341 -607
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +12 -7
- package/dist/sessions/streams.js +58 -15
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/titles.js +1 -1
- package/dist/sessions/titles.js.map +1 -1
- package/dist/sessions/todo.d.ts +5 -0
- package/dist/sessions/todo.js +28 -21
- package/dist/sessions/todo.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +8 -5
- package/dist/sessions/tool-display.js +28 -16
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +10 -1
- package/dist/sessions/turn-context.js +13 -6
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +110 -22
- package/dist/sessions/turn.js +918 -380
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +8 -13
- package/dist/sessions/wakeup-pause.js +31 -49
- package/dist/sessions/wakeup-pause.js.map +1 -1
- package/dist/sessions/window.js +13 -12
- package/dist/sessions/window.js.map +1 -1
- package/dist/settings.d.ts +19 -7
- package/dist/settings.js +179 -183
- package/dist/settings.js.map +1 -1
- package/dist/sidecar/client.d.ts +41 -4
- package/dist/sidecar/client.js +192 -42
- package/dist/sidecar/client.js.map +1 -1
- package/dist/sidecar/discover.d.ts +2 -1
- package/dist/sidecar/discover.js +93 -10
- package/dist/sidecar/discover.js.map +1 -1
- package/dist/sidecar/env.d.ts +4 -0
- package/dist/sidecar/env.js +3 -0
- package/dist/sidecar/env.js.map +1 -0
- package/dist/sidecar/fake.d.ts +6 -2
- package/dist/sidecar/fake.js +34 -4
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/spa.d.ts +9 -4
- package/dist/spa.js +36 -12
- package/dist/spa.js.map +1 -1
- package/dist/startup-timing.d.ts +66 -0
- package/dist/startup-timing.js +129 -0
- package/dist/startup-timing.js.map +1 -0
- package/dist/test/env-file.d.ts +5 -0
- package/dist/test/env-file.js +88 -0
- package/dist/test/env-file.js.map +1 -0
- package/dist/test/fs-handles.d.ts +11 -0
- package/dist/test/fs-handles.js +31 -0
- package/dist/test/fs-handles.js.map +1 -0
- package/dist/test/harness.d.ts +1 -0
- package/dist/test/harness.js +1 -1
- package/dist/test/harness.js.map +1 -1
- package/dist/test/passkeys.d.ts +22 -0
- package/dist/test/passkeys.js +62 -0
- package/dist/test/passkeys.js.map +1 -0
- package/dist/test/storage.d.ts +15 -0
- package/dist/test/storage.js +26 -0
- package/dist/test/storage.js.map +1 -0
- package/dist/tools/commands.d.ts +6 -1
- package/dist/tools/commands.js +8 -2
- package/dist/tools/commands.js.map +1 -1
- package/dist/tools/connectors.d.ts +33 -0
- package/dist/tools/connectors.js +121 -0
- package/dist/tools/connectors.js.map +1 -0
- package/dist/tools/crons.d.ts +46 -5
- package/dist/tools/crons.js +100 -26
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +34 -5
- package/dist/tools/dashboard-plugins.js +146 -14
- package/dist/tools/dashboard-plugins.js.map +1 -1
- package/dist/tools/extensions.d.ts +5 -4
- package/dist/tools/extensions.js +213 -207
- package/dist/tools/extensions.js.map +1 -1
- package/dist/tools/gateway-restart.d.ts +82 -0
- package/dist/tools/gateway-restart.js +222 -0
- package/dist/tools/gateway-restart.js.map +1 -0
- package/dist/tools/health.d.ts +28 -4
- package/dist/tools/health.js +171 -50
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/hygiene.d.ts +4 -3
- package/dist/tools/hygiene.js +23 -9
- package/dist/tools/hygiene.js.map +1 -1
- package/dist/tools/insights.d.ts +1 -1
- package/dist/tools/insights.js +2 -2
- package/dist/tools/insights.js.map +1 -1
- package/dist/tools/kanban.d.ts +4 -2
- package/dist/tools/kanban.js +28 -19
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/mcp-health.js +74 -24
- package/dist/tools/mcp-health.js.map +1 -1
- package/dist/tools/mcp.js +19 -1
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/memory-masks.d.ts +5 -0
- package/dist/tools/memory-masks.js +256 -0
- package/dist/tools/memory-masks.js.map +1 -0
- package/dist/tools/memory.d.ts +29 -3
- package/dist/tools/memory.js +69 -27
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/plugin-oauth.d.ts +14 -0
- package/dist/tools/plugin-oauth.js +53 -0
- package/dist/tools/plugin-oauth.js.map +1 -0
- package/dist/tools/plugin-settings.d.ts +15 -0
- package/dist/tools/plugin-settings.js +90 -0
- package/dist/tools/plugin-settings.js.map +1 -0
- package/dist/tools/prune-advice.d.ts +50 -0
- package/dist/tools/prune-advice.js +114 -0
- package/dist/tools/prune-advice.js.map +1 -0
- package/dist/tools/skills.d.ts +13 -5
- package/dist/tools/skills.js +53 -19
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +102 -17
- package/dist/tools/update-notifications.js +400 -82
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/update-rollback.d.ts +11 -0
- package/dist/tools/update-rollback.js +28 -0
- package/dist/tools/update-rollback.js.map +1 -0
- package/dist/tools/updates.d.ts +100 -33
- package/dist/tools/updates.js +1085 -345
- package/dist/tools/updates.js.map +1 -1
- package/dist/util.d.ts +2 -0
- package/dist/util.js +5 -0
- package/dist/util.js.map +1 -1
- package/dist/workspace/git.d.ts +16 -1
- package/dist/workspace/git.js +291 -11
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +12 -9
- package/dist/workspace/media.js +98 -38
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/preview.js +4 -14
- package/dist/workspace/preview.js.map +1 -1
- package/dist/workspace/rollback.d.ts +8 -4
- package/dist/workspace/rollback.js +22 -12
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/workspaces.d.ts +15 -19
- package/dist/workspace/workspaces.js +55 -127
- package/dist/workspace/workspaces.js.map +1 -1
- package/dist/workspace/worktrees.js +170 -32
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +6 -4
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +29 -0
- package/sidecar/scripts/record-fixtures.py +12 -3
- package/sidecar/scripts/replay_sidecar.py +8 -0
- package/sidecar/scripts/suite_runner.py +458 -0
- package/sidecar/scripts/test.sh +11 -5
- package/sidecar/talaria_sidecar/__init__.py +6 -1
- package/sidecar/talaria_sidecar/__main__.py +13 -4
- package/sidecar/talaria_sidecar/agent_mutation.py +1111 -0
- package/sidecar/talaria_sidecar/agent_services.py +1116 -0
- package/sidecar/talaria_sidecar/context_detail.py +59 -0
- package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
- package/sidecar/talaria_sidecar/home.py +133 -14
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +211 -41
- package/sidecar/talaria_sidecar/methods/chat.py +1378 -200
- package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
- package/sidecar/talaria_sidecar/methods/commands.py +483 -13
- package/sidecar/talaria_sidecar/methods/config.py +195 -6
- package/sidecar/talaria_sidecar/methods/connectors.py +375 -0
- package/sidecar/talaria_sidecar/methods/cron.py +374 -36
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +215 -55
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +418 -0
- package/sidecar/talaria_sidecar/methods/goals.py +81 -41
- package/sidecar/talaria_sidecar/methods/kanban.py +82 -30
- package/sidecar/talaria_sidecar/methods/memory.py +84 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +144 -13
- package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
- package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
- package/sidecar/talaria_sidecar/methods/process.py +229 -16
- package/sidecar/talaria_sidecar/methods/profiles.py +48 -9
- package/sidecar/talaria_sidecar/methods/providers.py +196 -26
- package/sidecar/talaria_sidecar/methods/runtime.py +71 -1
- package/sidecar/talaria_sidecar/methods/skills.py +83 -5
- package/sidecar/talaria_sidecar/methods/state_db.py +405 -112
- package/sidecar/talaria_sidecar/methods/stt.py +159 -78
- package/sidecar/talaria_sidecar/methods/text.py +14 -1
- package/sidecar/talaria_sidecar/methods/toolsets.py +51 -0
- package/sidecar/talaria_sidecar/methods/usage.py +113 -14
- package/sidecar/talaria_sidecar/methods/worktree.py +145 -19
- package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
- package/sidecar/talaria_sidecar/rpc.py +70 -7
- package/sidecar/talaria_sidecar/runtime.py +122 -14
- package/sidecar/talaria_sidecar/speed.py +47 -0
- package/sidecar/talaria_sidecar/startup_timing.py +119 -0
- package/static/dist/FILES.txt +242 -215
- package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
- package/static/dist/assets/AppShell-3isgvoro.js +8 -0
- package/static/dist/assets/Button-f4n6dapf.js +1 -0
- package/static/dist/assets/ChatPage-k7b6xfax.js +4 -0
- package/static/dist/assets/ConnectTargets-juqvt5lm.js +1 -0
- package/static/dist/assets/Dialog-hta5utr3.js +1 -0
- package/static/dist/assets/ExtensionRoute-zrhjn0wm.js +1 -0
- package/static/dist/assets/Field-b6ez48oz.js +1 -0
- package/static/dist/assets/HubRoute-iwvso2tz.js +2 -0
- package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
- package/static/dist/assets/Markdown-jdeth7zq.js +2 -0
- package/static/dist/assets/MarkdownRenderer-fbswsgld.js +302 -0
- package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
- package/static/dist/assets/OAuthSignIn-bpd8hom3.js +1 -0
- package/static/dist/assets/ResourceSwitch-odi6dy2o.js +1 -0
- package/static/dist/assets/RightPanel-eu6enlo6.js +1 -0
- package/static/dist/assets/Select-kr07928w.js +1 -0
- package/static/dist/assets/SessionListPanel-etb2i54l.js +1 -0
- package/static/dist/assets/SettingsLayout-eu3xxp23.js +1 -0
- package/static/dist/assets/States-icab19yg.js +1 -0
- package/static/dist/assets/TerminalPanel-hngmsr8b.js +16 -0
- package/static/dist/assets/Toaster-nb2uzjw1.js +1 -0
- package/static/dist/assets/_app-ga1moszl.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-na62087t.js +1 -0
- package/static/dist/assets/_app.index-jypgdqoi.js +1 -0
- package/static/dist/assets/_app.insights-kabejdtm.js +1 -0
- package/static/dist/assets/_app.kanban-m19kfcmx.js +1 -0
- package/static/dist/assets/_app.logs-iw4m96sz.js +1 -0
- package/static/dist/assets/_app.memory-jq5frwcg.js +1 -0
- package/static/dist/assets/_app.profiles-kwa3m7rp.js +1 -0
- package/static/dist/assets/_app.session._sessionId-o5lyeipj.js +1 -0
- package/static/dist/assets/_app.settings-ckl8hdll.js +1 -0
- package/static/dist/assets/_app.settings._section-dtdjk98a.js +3 -0
- package/static/dist/assets/_app.skills-n016rihd.js +1 -0
- package/static/dist/assets/_app.tasks-n8zuqsqe.js +1 -0
- package/static/dist/assets/_app.todos-btew5v2s.js +1 -0
- package/static/dist/assets/_app.workspaces-lnfk95ch.js +1 -0
- package/static/dist/assets/abnfDiagram-VCTEODGH-dttheegb.js +1 -0
- package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
- package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
- package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
- package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-ic435919.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-8r3glgiq.js +36 -0
- package/static/dist/assets/archive-il7c6053.js +1 -0
- package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
- package/static/dist/assets/back-gu3nu279.js +1 -0
- package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-jenyos6c.js} +4 -4
- package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-nzlx7yc4.js} +1 -1
- package/static/dist/assets/cancel-bsnfo36u.js +1 -0
- package/static/dist/assets/channel-dsbtk01y.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-g0cru63b.js} +20 -20
- package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-7rkswkjw.js} +1 -1
- package/static/dist/assets/chunk-DU6HZSFF-fn73jzdo.js +128 -0
- package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-oey8e72m.js} +1 -1
- package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
- package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-l2a32wiy.js} +6 -6
- package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-o9dwzh8h.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-eblwj20b.js} +5 -5
- package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-o2mufspb.js} +1 -1
- package/static/dist/assets/chunk-OSK3NFVY-ijp9pw29.js +10 -0
- package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-hs9hqwl4.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-bp9rsqez.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-brkprov6.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-gmpv0pxz.js} +13 -13
- package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-oldm08fu.js} +4 -4
- package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-ooqilfv7.js} +6 -6
- package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-fvgcv24g.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-fvgcv24g.js +1 -0
- package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
- package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
- package/static/dist/assets/copied-bz3gkazh.js +1 -0
- package/static/dist/assets/copy-jo006coq.js +1 -0
- package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
- package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
- package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
- package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
- package/static/dist/assets/cynefin-OW5HDTMX-d47op7qs.js +1 -0
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-doa7594y.js +62 -0
- package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
- package/static/dist/assets/dagre-GXQ25YYZ-os768dp4.js +4 -0
- package/static/dist/assets/dagre-o5jmjz46.js +1 -0
- package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-fyi81nxd.js} +4 -4
- package/static/dist/assets/diagram-UQ7AKVKN-j3exggaq.js +41 -0
- package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-omo1en2l.js} +1 -1
- package/static/dist/assets/diagram-VX7I27RA-oro2cyu0.js +24 -0
- package/static/dist/assets/diagram-Z3DM3KII-byt9vdb7.js +24 -0
- package/static/dist/assets/dist-crc46di9.js +7 -0
- package/static/dist/assets/dist-etpoyscq.js +44 -0
- package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
- package/static/dist/assets/ebnfDiagram-PWID7BFC-ee3haugh.js +1 -0
- package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
- package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
- package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
- package/static/dist/assets/erDiagram-RLTQ6QDP-d1e93yff.js +99 -0
- package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-i1ihb40c.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-jahfpiod.js +1 -0
- package/static/dist/assets/folder-plus-ivoglq98.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-m7g0jud4.js} +1 -1
- package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-hzdj07yy.js +1 -0
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-dm9agbna.js} +1 -1
- package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
- package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
- package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
- package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
- package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
- package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
- package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-mmgz2czu.js +1 -0
- package/static/dist/assets/host-fr6lni1p.js +1 -0
- package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
- package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
- package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
- package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
- package/static/dist/assets/index-73649w7o.js +10 -0
- package/static/dist/assets/index-lhf1fsdf.css +2 -0
- package/static/dist/assets/info-A6RAGUB7-lll1dqmm.js +1 -0
- package/static/dist/assets/infoDiagram-27XIBGKW-k7esc639.js +2 -0
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-lgr6k9wo.js} +6 -6
- package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
- package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
- package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
- package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-ndmbxuqk.js} +1 -1
- package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
- package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
- package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
- package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
- package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-mjxym0jp.js} +28 -28
- package/static/dist/assets/katex-cbdd1ohw.css +1 -0
- package/static/dist/assets/katex-pbij2oo6.js +257 -0
- package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-cwb6l7xh.js +1 -0
- package/static/dist/assets/{line-meizqsvn.js → line-mtr5k6il.js} +1 -1
- package/static/dist/assets/linear-jlwrvvy6.js +1 -0
- package/static/dist/assets/link-iadw4ghw.js +2 -0
- package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
- package/static/dist/assets/locale-cs-n41hptse.js +5 -0
- package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
- package/static/dist/assets/locale-es-ih078lco.js +5 -0
- package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
- package/static/dist/assets/locale-it-kb96jufy.js +5 -0
- package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
- package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
- package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
- package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
- package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
- package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
- package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
- package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
- package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
- package/static/dist/assets/login-lkhtzfcl.js +1 -0
- package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
- package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
- package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-jx0q5dm2.js +1 -0
- package/static/dist/assets/mermaid-parser.core-k91vdnvi.js +7 -0
- package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-ehztfea4.js} +28 -28
- package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
- package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
- package/static/dist/assets/onboarding-f67z0a2r.js +1 -0
- package/static/dist/assets/packet-AYTQ26CC-ok2xrblz.js +1 -0
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/pegDiagram-XKGWAZYB-ec3rpj0m.js +1 -0
- package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
- package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
- package/static/dist/assets/pie-WAS4IAKB-iwkir23u.js +1 -0
- package/static/dist/assets/pieDiagram-E7YTZNPT-fcpqpekh.js +39 -0
- package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
- package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-lqsync43.js} +1 -1
- package/static/dist/assets/queryKeys-ed4n2egc.js +9 -0
- package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
- package/static/dist/assets/radar-RG4KPBEZ-hje4jbk6.js +1 -0
- package/static/dist/assets/railroad-74A4TZTK-gll9n6qi.js +1 -0
- package/static/dist/assets/railroad-abnf-HS5TGJTU-o6h6lpn4.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-juaefj6o.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-cgfhvpah.js +1 -0
- package/static/dist/assets/railroadDiagram-O6MQD6OU-lp3w7awf.js +1 -0
- package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
- package/static/dist/assets/refresh-cw-iccm7a4e.js +1 -0
- package/static/dist/assets/refresh-i9ya9dvl.js +1 -0
- package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
- package/static/dist/assets/registry-g7w3353u.js +1 -0
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ha8eibcf.js +84 -0
- package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
- package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
- package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
- package/static/dist/assets/runtime-nlxpnegr.js +1 -0
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-oxf31pr9.js} +1 -1
- package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
- package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-jiq8lhyo.js} +11 -11
- package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
- package/static/dist/assets/share._token-o76ki0ly.js +2 -0
- package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
- package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
- package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
- package/static/dist/assets/sliders-horizontal-ddcs88av.js +1 -0
- package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
- package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
- package/static/dist/assets/src-h89s0hs4.js +1 -0
- package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-f3fslnon.js +1 -0
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hlt6yphw.js +1 -0
- package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
- package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
- package/static/dist/assets/swimlanes-42K2YHIH-k1hmk7jf.js +1 -0
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hd5t9tnt.js +8 -0
- package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
- package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
- package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-n3ncfy9r.js} +8 -8
- package/static/dist/assets/toast-liparz2j.js +56 -0
- package/static/dist/assets/treeView-Q6P3EWNA-l3y2pejt.js +1 -0
- package/static/dist/assets/treemap-WGGIJYW6-jown9axh.js +1 -0
- package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
- package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
- package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
- package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
- package/static/dist/assets/untitled-mj86r4gz.js +1 -0
- package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
- package/static/dist/assets/useForm-o4uu74mx.js +1 -0
- package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-ftsveu84.js} +1 -1
- package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-crqueqga.js} +1 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-dh59uq1c.js +34 -0
- package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
- package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
- package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
- package/static/dist/assets/wardley-WFR3VGLG-e6d74b0j.js +1 -0
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hnofh78f.js +78 -0
- package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
- package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
- package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-bpymjelb.js} +6 -6
- package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
- package/static/dist/extension-sdk.js +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +180 -136
- package/static/dist/assets/AppShell-g3bkgnvt.js +0 -1
- package/static/dist/assets/ChatPage-oo7bdan6.js +0 -25
- package/static/dist/assets/Dialog-g355qxhp.js +0 -1
- package/static/dist/assets/ExtensionRoute-i2y9fvjm.js +0 -1
- package/static/dist/assets/HubRoute-lmkrbw47.js +0 -2
- package/static/dist/assets/Markdown-j4kut4j2.js +0 -598
- package/static/dist/assets/Markdown-lwviulmg.css +0 -1
- package/static/dist/assets/RightPanel-ohlsdzfl.js +0 -1
- package/static/dist/assets/Select-kddq75qc.js +0 -1
- package/static/dist/assets/SessionListPanel-lu3oy0hw.js +0 -1
- package/static/dist/assets/SettingsLayout-o9bv4mgb.js +0 -1
- package/static/dist/assets/States-eq6fe29m.js +0 -1
- package/static/dist/assets/Toaster-pc247u9f.js +0 -1
- package/static/dist/assets/_app-f8n1i0m1.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-gfbzpoou.js +0 -1
- package/static/dist/assets/_app.index-bzzv80hk.js +0 -1
- package/static/dist/assets/_app.insights-dzixbryi.js +0 -1
- package/static/dist/assets/_app.kanban-c6hep2us.js +0 -1
- package/static/dist/assets/_app.logs-i69qds98.js +0 -1
- package/static/dist/assets/_app.memory-kl4vf0gd.js +0 -1
- package/static/dist/assets/_app.profiles-b8zinmyp.js +0 -1
- package/static/dist/assets/_app.session._sessionId-fn1bhde6.js +0 -1
- package/static/dist/assets/_app.settings-cg8plwmf.js +0 -1
- package/static/dist/assets/_app.settings._section-bkwbi9zn.js +0 -3
- package/static/dist/assets/_app.skills-cs47sbvs.js +0 -1
- package/static/dist/assets/_app.tasks-dwvk64tc.js +0 -1
- package/static/dist/assets/_app.todos-c8xjm8p3.js +0 -1
- package/static/dist/assets/_app.workspaces-ehvd1gds.js +0 -1
- package/static/dist/assets/abnfDiagram-VCTEODGH-c8kdixke.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-6crvnylg.js +0 -1
- package/static/dist/assets/architectureDiagram-5GKGNRK7-cku06x1p.js +0 -36
- package/static/dist/assets/back-h7aun7ew.js +0 -1
- package/static/dist/assets/cancel-fhi0vcnu.js +0 -1
- package/static/dist/assets/channel-b2zo73z1.js +0 -1
- package/static/dist/assets/chunk-DU6HZSFF-ofajdixh.js +0 -128
- package/static/dist/assets/chunk-OSK3NFVY-e7gkikcw.js +0 -10
- package/static/dist/assets/classDiagram-ZZMXUADV-oe99st8x.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-oe99st8x.js +0 -1
- package/static/dist/assets/copied-hcplv46p.js +0 -1
- package/static/dist/assets/copy-magtofyp.js +0 -1
- package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
- package/static/dist/assets/cynefin-OW5HDTMX-siqlulkl.js +0 -1
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-i648tah9.js +0 -62
- package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
- package/static/dist/assets/dagre-GXQ25YYZ-mwn6uc17.js +0 -4
- package/static/dist/assets/dagre-lkoknbjn.js +0 -1
- package/static/dist/assets/diagram-UQ7AKVKN-mekq7zgq.js +0 -41
- package/static/dist/assets/diagram-VX7I27RA-xe6r5qfw.js +0 -24
- package/static/dist/assets/diagram-Z3DM3KII-nq07dg7k.js +0 -24
- package/static/dist/assets/ebnfDiagram-PWID7BFC-c62ipm3g.js +0 -1
- package/static/dist/assets/endpoints-klbxod4t.js +0 -64
- package/static/dist/assets/erDiagram-RLTQ6QDP-h39kmnzy.js +0 -99
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.js +0 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-fr2i7caa.js +0 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-jwpop9p8.js +0 -1
- package/static/dist/assets/host-i828xuo7.js +0 -1
- package/static/dist/assets/index-eh8zilnv.css +0 -2
- package/static/dist/assets/index-r648f4o1.js +0 -11
- package/static/dist/assets/info-A6RAGUB7-h11x0dxo.js +0 -1
- package/static/dist/assets/infoDiagram-27XIBGKW-dfh47dw9.js +0 -2
- package/static/dist/assets/lazyRouteComponent-e1y4t2i9.js +0 -1
- package/static/dist/assets/linear-becwlnhk.js +0 -1
- package/static/dist/assets/link-oot2yn73.js +0 -1
- package/static/dist/assets/login-gu28l9ou.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-mtwrj8fn.js +0 -1
- package/static/dist/assets/mermaid-parser.core-ntne45i9.js +0 -7
- package/static/dist/assets/not-found-ccnnac39.js +0 -1
- package/static/dist/assets/onboarding-lkphzu1s.js +0 -1
- package/static/dist/assets/onboarding_model_label-ftpjdwqk.js +0 -1
- package/static/dist/assets/packet-AYTQ26CC-l6jdka8p.js +0 -1
- package/static/dist/assets/pegDiagram-XKGWAZYB-g1er3bxj.js +0 -1
- package/static/dist/assets/pie-WAS4IAKB-i0ylcrt9.js +0 -1
- package/static/dist/assets/pieDiagram-E7YTZNPT-fbz1e55z.js +0 -39
- package/static/dist/assets/radar-RG4KPBEZ-f9b70aa4.js +0 -1
- package/static/dist/assets/railroad-74A4TZTK-lgsuoeda.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nf9d6pdx.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-f7ummkt5.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-oczq5tqs.js +0 -1
- package/static/dist/assets/railroadDiagram-O6MQD6OU-eqpy9fnz.js +0 -1
- package/static/dist/assets/refresh-abtu93ke.js +0 -1
- package/static/dist/assets/refresh-cw-hlwb02qv.js +0 -1
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ogf6puhi.js +0 -84
- package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
- package/static/dist/assets/root-mbklpuv4.js +0 -1
- package/static/dist/assets/saved-girnabkf.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-h14cwk6f.js +0 -1
- package/static/dist/assets/share._token-kl0r7ido.js +0 -2
- package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +0 -1
- package/static/dist/assets/sliders-horizontal-n1zm34qq.js +0 -1
- package/static/dist/assets/src-hjyib4mu.js +0 -1
- package/static/dist/assets/sse-iwku0sjo.js +0 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-fyoznpcs.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.js +0 -1
- package/static/dist/assets/swimlanes-42K2YHIH-oefldhfy.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-h9ersk2e.js +0 -8
- package/static/dist/assets/todoStore-jjr5yr78.js +0 -1
- package/static/dist/assets/treeView-Q6P3EWNA-f7hcci5o.js +0 -1
- package/static/dist/assets/treemap-WGGIJYW6-nl85071a.js +0 -1
- package/static/dist/assets/units-kgxzxfhi.js +0 -1
- package/static/dist/assets/untitled-cikfjntn.js +0 -1
- package/static/dist/assets/useForm-kqoqg0k9.js +0 -1
- package/static/dist/assets/useLocale-o59tbiea.js +0 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-h5hzbk0n.js +0 -34
- package/static/dist/assets/wardley-WFR3VGLG-jftvpm3e.js +0 -1
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-hedh85ge.js +0 -78
- /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
package/dist/tools/extensions.js
CHANGED
|
@@ -5,7 +5,8 @@ import { resolvePathLikePython } from '../workspace/paths.js';
|
|
|
5
5
|
import { createHash } from 'node:crypto';
|
|
6
6
|
import { closeSync, existsSync, fstatSync, lstatSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
7
7
|
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
8
|
-
import {
|
|
8
|
+
import { InvalidDocument } from '../sessions/storage/backend.js';
|
|
9
|
+
import { readDocument } from '../sessions/storage/document.js';
|
|
9
10
|
import { readZip } from '../workspace/unzip.js';
|
|
10
11
|
import { isDict } from '../config/agent-config.js';
|
|
11
12
|
import { str } from '../util.js';
|
|
@@ -339,8 +340,7 @@ export class ExtensionService {
|
|
|
339
340
|
this.deps = deps;
|
|
340
341
|
}
|
|
341
342
|
get defaultRoot() { return join(this.deps.stateDir, 'extensions'); }
|
|
342
|
-
|
|
343
|
-
get installFile() { return join(this.deps.stateDir, 'extension-install-manifest.json'); }
|
|
343
|
+
revisions = new Map();
|
|
344
344
|
root() {
|
|
345
345
|
const raw = (this.deps.env.HERMES_WEBUI_EXTENSION_DIR ?? '').trim();
|
|
346
346
|
if (raw) {
|
|
@@ -365,22 +365,25 @@ export class ExtensionService {
|
|
|
365
365
|
return null;
|
|
366
366
|
}
|
|
367
367
|
}
|
|
368
|
-
loadState(d) {
|
|
368
|
+
async loadState(d) {
|
|
369
369
|
const empty = { version: 1, disabled_extensions: [], sidecar_proxy_consents: {} };
|
|
370
370
|
const src = 'extension_state';
|
|
371
371
|
let parsed;
|
|
372
372
|
try {
|
|
373
|
-
|
|
373
|
+
const record = await readDocument(this.deps.documents, 'extensions', 'overrides', { replaceInvalid: true, maxBytes: MAX_STATE_BYTES });
|
|
374
|
+
this.revisions.set('overrides', record?.revision ?? null);
|
|
375
|
+
if (!record)
|
|
374
376
|
return empty;
|
|
375
|
-
|
|
376
|
-
if (raw.length > MAX_STATE_BYTES) {
|
|
377
|
+
if (Buffer.byteLength(JSON.stringify(record.value)) > MAX_STATE_BYTES) {
|
|
377
378
|
warn(d, 'extension_state_oversized', src);
|
|
378
379
|
return empty;
|
|
379
380
|
}
|
|
380
|
-
parsed =
|
|
381
|
+
parsed = record.value;
|
|
381
382
|
}
|
|
382
|
-
catch {
|
|
383
|
-
|
|
383
|
+
catch (error) {
|
|
384
|
+
if (error instanceof InvalidDocument && error.reason === 'too-large')
|
|
385
|
+
this.revisions.set('overrides', error.revision);
|
|
386
|
+
warn(d, error instanceof InvalidDocument && error.reason === 'too-large' ? 'extension_state_oversized' : 'extension_state_unreadable', src);
|
|
384
387
|
return empty;
|
|
385
388
|
}
|
|
386
389
|
if (!isDict(parsed)) {
|
|
@@ -440,19 +443,17 @@ export class ExtensionService {
|
|
|
440
443
|
warn(d, 'extension_state_invalid_entries', src);
|
|
441
444
|
return { version: 1, disabled_extensions: disabled, sidecar_proxy_consents: consents };
|
|
442
445
|
}
|
|
443
|
-
writeState(state) {
|
|
444
|
-
|
|
445
|
-
atomicWriteText(this.stateFile, JSON.stringify({ version: 1, disabled_extensions: [...new Set(state.disabled_extensions.filter(validId))].sort(), sidecar_proxy_consents: state.sidecar_proxy_consents }, null, 2));
|
|
446
|
+
async writeState(state) {
|
|
447
|
+
this.revisions.set('overrides', await this.deps.documents.put('extensions', 'overrides', { version: 1, disabled_extensions: [...new Set(state.disabled_extensions.filter(validId))].sort(), sidecar_proxy_consents: state.sidecar_proxy_consents }, this.revisions.get('overrides') ?? null));
|
|
446
448
|
}
|
|
447
|
-
loadInstallManifest() {
|
|
449
|
+
async loadInstallManifest() {
|
|
448
450
|
const empty = { version: 1, installed: {} };
|
|
449
451
|
try {
|
|
450
|
-
|
|
452
|
+
const record = await readDocument(this.deps.documents, 'extensions', 'install-manifest', { replaceInvalid: true, maxBytes: MAX_INSTALL_MANIFEST_BYTES });
|
|
453
|
+
this.revisions.set('install-manifest', record?.revision ?? null);
|
|
454
|
+
if (!record || Buffer.byteLength(JSON.stringify(record.value)) > MAX_INSTALL_MANIFEST_BYTES)
|
|
451
455
|
return empty;
|
|
452
|
-
const
|
|
453
|
-
if (raw.length > MAX_INSTALL_MANIFEST_BYTES)
|
|
454
|
-
return empty;
|
|
455
|
-
const parsed = JSON.parse(raw.toString('utf8'));
|
|
456
|
+
const parsed = record.value;
|
|
456
457
|
if (!isDict(parsed) || !isDict(parsed.installed))
|
|
457
458
|
return empty;
|
|
458
459
|
const installed = {};
|
|
@@ -465,13 +466,14 @@ export class ExtensionService {
|
|
|
465
466
|
}
|
|
466
467
|
return { version: 1, installed };
|
|
467
468
|
}
|
|
468
|
-
catch {
|
|
469
|
+
catch (error) {
|
|
470
|
+
if (error instanceof InvalidDocument && error.reason === 'too-large')
|
|
471
|
+
this.revisions.set('install-manifest', error.revision);
|
|
469
472
|
return empty;
|
|
470
473
|
}
|
|
471
474
|
}
|
|
472
|
-
writeInstallManifest(manifest) {
|
|
473
|
-
|
|
474
|
-
atomicWriteText(this.installFile, JSON.stringify(manifest, null, 2));
|
|
475
|
+
async writeInstallManifest(manifest) {
|
|
476
|
+
this.revisions.set('install-manifest', await this.deps.documents.put('extensions', 'install-manifest', manifest, this.revisions.get('install-manifest') ?? null));
|
|
475
477
|
}
|
|
476
478
|
manifestPath(root) {
|
|
477
479
|
const raw = (this.deps.env.HERMES_WEBUI_EXTENSION_MANIFEST ?? '').trim();
|
|
@@ -492,8 +494,8 @@ export class ExtensionService {
|
|
|
492
494
|
return [null, 'invalid_path'];
|
|
493
495
|
return [manifest, 'configured'];
|
|
494
496
|
}
|
|
495
|
-
galleryManifest(root, d) {
|
|
496
|
-
const installed = this.loadInstallManifest().installed;
|
|
497
|
+
async galleryManifest(root, d) {
|
|
498
|
+
const installed = (await this.loadInstallManifest()).installed;
|
|
497
499
|
const entries = [];
|
|
498
500
|
for (const id of Object.keys(installed).sort()) {
|
|
499
501
|
if (!validId(id))
|
|
@@ -550,14 +552,14 @@ export class ExtensionService {
|
|
|
550
552
|
}
|
|
551
553
|
return entries.length ? { extensions: entries } : null;
|
|
552
554
|
}
|
|
553
|
-
loadManifest(root, d) {
|
|
555
|
+
async loadManifest(root, d) {
|
|
554
556
|
const [file, pathStatus] = this.manifestPath(root);
|
|
555
557
|
const status = { configured: pathStatus !== 'not_configured', loaded: false, status: pathStatus, _asset_base: '', entry_count: 0, script_count: 0, stylesheet_count: 0, sidecar_count: 0 };
|
|
556
558
|
if (!file) {
|
|
557
559
|
if (pathStatus === 'invalid_path')
|
|
558
560
|
warn(d, 'manifest_invalid_path', 'manifest');
|
|
559
561
|
else if (pathStatus === 'not_configured') {
|
|
560
|
-
const gallery = this.galleryManifest(root, d);
|
|
562
|
+
const gallery = (await this.galleryManifest(root, d));
|
|
561
563
|
if (gallery)
|
|
562
564
|
return [gallery, { ...status, loaded: true, status: 'gallery_installed' }];
|
|
563
565
|
}
|
|
@@ -739,7 +741,7 @@ export class ExtensionService {
|
|
|
739
741
|
const d = { warnings: [] };
|
|
740
742
|
const envDir = (this.deps.env.HERMES_WEBUI_EXTENSION_DIR ?? '').trim();
|
|
741
743
|
const root = this.root();
|
|
742
|
-
const state = this.loadState(d);
|
|
744
|
+
const state = (await this.loadState(d));
|
|
743
745
|
const disabled = new Set(state.disabled_extensions);
|
|
744
746
|
const manifestConfigured = Boolean((this.deps.env.HERMES_WEBUI_EXTENSION_MANIFEST ?? '').trim());
|
|
745
747
|
if (envDir && !root)
|
|
@@ -747,7 +749,7 @@ export class ExtensionService {
|
|
|
747
749
|
if (!root) {
|
|
748
750
|
return { manifest: null, assetBase: '', sidecarsById: new Map(), status: { enabled: false, extension_dir_configured: true, extension_dir_valid: false, script_urls: [], stylesheet_urls: [], sidecars: [], counts: { script_urls: 0, stylesheet_urls: 0, sidecars: 0, manifest_extensions: 0, user_disabled: 0 }, manifest: { configured: manifestConfigured, loaded: false, status: manifestConfigured ? 'extension_disabled' : 'not_configured', entry_count: 0, script_count: 0, stylesheet_count: 0, sidecar_count: 0 }, extensions: [], warnings: d.warnings } };
|
|
749
751
|
}
|
|
750
|
-
const [manifest, status] = this.loadManifest(root, d);
|
|
752
|
+
const [manifest, status] = (await this.loadManifest(root, d));
|
|
751
753
|
const consentIds = new Set(Object.keys(state.sidecar_proxy_consents));
|
|
752
754
|
const ext = manifest !== null ? this.extensionState(manifest, disabled, d, consentIds) : { extensions: [], knownIds: new Set(), manifestDisabled: new Set() };
|
|
753
755
|
const urls = manifest !== null ? await this.manifestUrls(manifest, status, disabled, state, d) : { scripts: [], stylesheets: [], sidecars: [], sidecarsById: new Map() };
|
|
@@ -757,12 +759,12 @@ export class ExtensionService {
|
|
|
757
759
|
return { manifest, assetBase: str(status._asset_base), sidecarsById: urls.sidecarsById, status: {
|
|
758
760
|
enabled: true, extension_dir_configured: true, extension_dir_valid: true, script_urls: scriptUrls, stylesheet_urls: stylesheetUrls, sidecars: urls.sidecars,
|
|
759
761
|
counts: { script_urls: scriptUrls.length, stylesheet_urls: stylesheetUrls.length, sidecars: urls.sidecars.length, manifest_extensions: ext.extensions.length, user_disabled: [...disabled].filter((id) => ext.knownIds.has(id)).length },
|
|
760
|
-
manifest: publicStatus, extensions: ext.extensions, gallery_installed: this.loadInstallManifest().installed, warnings: d.warnings,
|
|
762
|
+
manifest: publicStatus, extensions: ext.extensions, gallery_installed: (await this.loadInstallManifest()).installed, warnings: d.warnings,
|
|
761
763
|
} };
|
|
762
764
|
}
|
|
763
|
-
loaded(root, d) {
|
|
764
|
-
const state = this.loadState(d);
|
|
765
|
-
const [manifest, status] = this.loadManifest(root, d);
|
|
765
|
+
async loaded(root, d) {
|
|
766
|
+
const state = (await this.loadState(d));
|
|
767
|
+
const [manifest, status] = (await this.loadManifest(root, d));
|
|
766
768
|
if (manifest === null || status.loaded !== true)
|
|
767
769
|
throw new ExtensionError('Extension manifest is not loaded', 409);
|
|
768
770
|
return { manifest, state, disabled: new Set(state.disabled_extensions) };
|
|
@@ -777,14 +779,14 @@ export class ExtensionService {
|
|
|
777
779
|
throw new ExtensionError('Invalid extension id', 400);
|
|
778
780
|
if (typeof enabled !== 'boolean')
|
|
779
781
|
throw new ExtensionError('enabled must be a boolean', 400);
|
|
780
|
-
return this.mutateState(async () => this.setEnabledLocked(idRaw.trim(), enabled));
|
|
782
|
+
return this.mutateState(async () => (await this.setEnabledLocked(idRaw.trim(), enabled)));
|
|
781
783
|
}
|
|
782
784
|
async setEnabledLocked(id, enabled) {
|
|
783
785
|
const root = this.root();
|
|
784
786
|
if (!root)
|
|
785
787
|
throw new ExtensionError('Extensions are not configured', 404);
|
|
786
788
|
const d = { warnings: [] };
|
|
787
|
-
const { manifest, state, disabled } = this.loaded(root, d);
|
|
789
|
+
const { manifest, state, disabled } = (await this.loaded(root, d));
|
|
788
790
|
const ext = this.extensionState(manifest, disabled, d, new Set(Object.keys(state.sidecar_proxy_consents)));
|
|
789
791
|
if (!ext.knownIds.has(id))
|
|
790
792
|
throw new ExtensionError('Extension not found', 404);
|
|
@@ -794,7 +796,7 @@ export class ExtensionService {
|
|
|
794
796
|
disabled.delete(id);
|
|
795
797
|
else
|
|
796
798
|
disabled.add(id);
|
|
797
|
-
this.writeState({ disabled_extensions: [...disabled], sidecar_proxy_consents: Object.fromEntries(Object.entries(state.sidecar_proxy_consents).filter(([k]) => ext.knownIds.has(k))) });
|
|
799
|
+
await this.writeState({ disabled_extensions: [...disabled], sidecar_proxy_consents: Object.fromEntries(Object.entries(state.sidecar_proxy_consents).filter(([k]) => ext.knownIds.has(k))) });
|
|
798
800
|
return this.status();
|
|
799
801
|
}
|
|
800
802
|
setConsent(idRaw, approved) {
|
|
@@ -802,14 +804,14 @@ export class ExtensionService {
|
|
|
802
804
|
throw new ExtensionError('Invalid extension id', 400);
|
|
803
805
|
if (typeof approved !== 'boolean')
|
|
804
806
|
throw new ExtensionError('approved must be a boolean', 400);
|
|
805
|
-
return this.mutateState(() => this.setConsentLocked(idRaw.trim(), approved));
|
|
807
|
+
return this.mutateState(async () => (await this.setConsentLocked(idRaw.trim(), approved)));
|
|
806
808
|
}
|
|
807
809
|
async setConsentLocked(id, approved) {
|
|
808
810
|
const root = this.root();
|
|
809
811
|
if (!root)
|
|
810
812
|
throw new ExtensionError('Extensions are not configured', 404);
|
|
811
813
|
const d = { warnings: [] };
|
|
812
|
-
const { manifest, state, disabled } = this.loaded(root, d);
|
|
814
|
+
const { manifest, state, disabled } = (await this.loaded(root, d));
|
|
813
815
|
const consents = { ...state.sidecar_proxy_consents };
|
|
814
816
|
const ext = this.extensionState(manifest, disabled, d, new Set(Object.keys(consents)));
|
|
815
817
|
if (!ext.knownIds.has(id))
|
|
@@ -827,7 +829,7 @@ export class ExtensionService {
|
|
|
827
829
|
}
|
|
828
830
|
else
|
|
829
831
|
Reflect.deleteProperty(consents, id);
|
|
830
|
-
this.writeState({ disabled_extensions: [...disabled], sidecar_proxy_consents: Object.fromEntries(Object.entries(consents).filter(([k]) => ext.knownIds.has(k))) });
|
|
832
|
+
await this.writeState({ disabled_extensions: [...disabled], sidecar_proxy_consents: Object.fromEntries(Object.entries(consents).filter(([k]) => ext.knownIds.has(k))) });
|
|
831
833
|
return this.status();
|
|
832
834
|
}
|
|
833
835
|
/** Python `resolve_extension_sidecar_proxy_target` (legacy proxy auth only). */
|
|
@@ -842,7 +844,7 @@ export class ExtensionService {
|
|
|
842
844
|
throw new ExtensionError('Extensions are not configured', 404);
|
|
843
845
|
const id = idRaw.trim();
|
|
844
846
|
const d = { warnings: [] };
|
|
845
|
-
const { manifest, state, disabled } = this.loaded(root, d);
|
|
847
|
+
const { manifest, state, disabled } = (await this.loaded(root, d));
|
|
846
848
|
const ext = this.extensionState(manifest, disabled, d, new Set(Object.keys(state.sidecar_proxy_consents)));
|
|
847
849
|
if (!ext.knownIds.has(id))
|
|
848
850
|
throw new ExtensionError('Extension not found', 404);
|
|
@@ -908,191 +910,195 @@ export class ExtensionService {
|
|
|
908
910
|
}
|
|
909
911
|
}
|
|
910
912
|
async install(idRaw, downloadUrl, sha256) {
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
host = new URL(downloadUrl).hostname;
|
|
919
|
-
}
|
|
920
|
-
catch {
|
|
921
|
-
host = '';
|
|
922
|
-
}
|
|
923
|
-
if (!ALLOWED_DOWNLOAD_HOSTS.has(host))
|
|
924
|
-
throw new ExtensionError('Invalid download URL');
|
|
925
|
-
if (typeof sha256 !== 'string' || !/^[0-9a-f]{64}$/.test(sha256))
|
|
926
|
-
throw new ExtensionError('Invalid sha256');
|
|
927
|
-
const root = this.writableRoot();
|
|
928
|
-
if (!root)
|
|
929
|
-
throw new ExtensionError('Extensions not configured', 404);
|
|
930
|
-
let raw;
|
|
931
|
-
try {
|
|
932
|
-
const res = await this.galleryFetch(downloadUrl, 30_000);
|
|
933
|
-
if (!res.ok)
|
|
934
|
-
throw new Error(`download ${String(res.status)}`);
|
|
935
|
-
const capped = await readCapped(res, MAX_ZIP_BYTES);
|
|
936
|
-
if (!capped)
|
|
937
|
-
throw new ExtensionError('Download too large');
|
|
938
|
-
raw = capped;
|
|
939
|
-
}
|
|
940
|
-
catch (error) {
|
|
941
|
-
throw new ExtensionError(error instanceof ExtensionError ? error.message : 'Download failed', error instanceof ExtensionError ? error.status : 502);
|
|
942
|
-
}
|
|
943
|
-
if (createHash('sha256').update(raw).digest('hex') !== sha256)
|
|
944
|
-
throw new ExtensionError('SHA-256 mismatch');
|
|
945
|
-
let entries;
|
|
946
|
-
try {
|
|
947
|
-
entries = readZip(raw);
|
|
948
|
-
}
|
|
949
|
-
catch {
|
|
950
|
-
throw new ExtensionError('Invalid zip archive');
|
|
951
|
-
}
|
|
952
|
-
const files = entries.filter((e) => e.name && !e.isDir);
|
|
953
|
-
if (files.reduce((acc, e) => acc + e.size, 0) > MAX_ZIP_BYTES * 10)
|
|
954
|
-
throw new ExtensionError('Archive uncompressed size exceeds limit');
|
|
955
|
-
if (files.length > 1024)
|
|
956
|
-
throw new ExtensionError('Archive contains too many files');
|
|
957
|
-
const prefix = files.every((e) => e.name.startsWith(`${id}/`)) ? `${id}/` : '';
|
|
958
|
-
const stripped = (name) => (prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name);
|
|
959
|
-
const anchor = resolvePathLikePython(root);
|
|
960
|
-
const extDir = resolve(anchor, id);
|
|
961
|
-
for (const e of files) {
|
|
962
|
-
const decoded = fullyUnquote(stripped(e.name));
|
|
963
|
-
if (!decoded || !isSafeArchiveMember(decoded))
|
|
964
|
-
throw new ExtensionError('Unsafe archive member');
|
|
965
|
-
const target = resolve(extDir, decoded);
|
|
966
|
-
if (!target.startsWith(anchor + sep) || !target.startsWith(extDir + sep))
|
|
967
|
-
throw new ExtensionError('Zip-slip detected');
|
|
968
|
-
}
|
|
969
|
-
let version = 'unknown';
|
|
970
|
-
for (const vfile of ['extension.json', 'manifest.json']) {
|
|
971
|
-
const entry = entries.find((e) => e.name === prefix + vfile);
|
|
972
|
-
if (!entry)
|
|
973
|
-
continue;
|
|
913
|
+
return await this.mutateState(async () => {
|
|
914
|
+
if (!validId(idRaw))
|
|
915
|
+
throw new ExtensionError('Invalid extension id');
|
|
916
|
+
const id = idRaw.trim();
|
|
917
|
+
if (typeof downloadUrl !== 'string' || !downloadUrl.startsWith('https://'))
|
|
918
|
+
throw new ExtensionError('Invalid download URL');
|
|
919
|
+
let host = '';
|
|
974
920
|
try {
|
|
975
|
-
|
|
976
|
-
if (isDict(m) && typeof m.version === 'string') {
|
|
977
|
-
version = m.version;
|
|
978
|
-
break;
|
|
979
|
-
}
|
|
921
|
+
host = new URL(downloadUrl).hostname;
|
|
980
922
|
}
|
|
981
|
-
catch {
|
|
982
|
-
|
|
983
|
-
try {
|
|
984
|
-
if (lstatSync(extDir).isSymbolicLink())
|
|
985
|
-
throw new ExtensionError('Extension directory is a symlink', 400);
|
|
986
|
-
}
|
|
987
|
-
catch (error) {
|
|
988
|
-
if (error instanceof ExtensionError)
|
|
989
|
-
throw error;
|
|
990
|
-
}
|
|
991
|
-
try {
|
|
992
|
-
makeAnchoredDir(anchor, extDir);
|
|
993
|
-
}
|
|
994
|
-
catch {
|
|
995
|
-
throw new ExtensionError('Extension directory is a symlink', 400);
|
|
996
|
-
}
|
|
997
|
-
const written = [];
|
|
998
|
-
const rollback = () => {
|
|
999
|
-
for (const p of written) {
|
|
1000
|
-
try {
|
|
1001
|
-
unlinkAnchored(anchor, p);
|
|
1002
|
-
}
|
|
1003
|
-
catch { /* gone */ }
|
|
923
|
+
catch {
|
|
924
|
+
host = '';
|
|
1004
925
|
}
|
|
926
|
+
if (!ALLOWED_DOWNLOAD_HOSTS.has(host))
|
|
927
|
+
throw new ExtensionError('Invalid download URL');
|
|
928
|
+
if (typeof sha256 !== 'string' || !/^[0-9a-f]{64}$/.test(sha256))
|
|
929
|
+
throw new ExtensionError('Invalid sha256');
|
|
930
|
+
const root = this.writableRoot();
|
|
931
|
+
if (!root)
|
|
932
|
+
throw new ExtensionError('Extensions not configured', 404);
|
|
933
|
+
let raw;
|
|
1005
934
|
try {
|
|
1006
|
-
|
|
935
|
+
const res = await this.galleryFetch(downloadUrl, 30_000);
|
|
936
|
+
if (!res.ok)
|
|
937
|
+
throw new Error(`download ${String(res.status)}`);
|
|
938
|
+
const capped = await readCapped(res, MAX_ZIP_BYTES);
|
|
939
|
+
if (!capped)
|
|
940
|
+
throw new ExtensionError('Download too large');
|
|
941
|
+
raw = capped;
|
|
1007
942
|
}
|
|
1008
|
-
catch {
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
943
|
+
catch (error) {
|
|
944
|
+
throw new ExtensionError(error instanceof ExtensionError ? error.message : 'Download failed', error instanceof ExtensionError ? error.status : 502);
|
|
945
|
+
}
|
|
946
|
+
if (createHash('sha256').update(raw).digest('hex') !== sha256)
|
|
947
|
+
throw new ExtensionError('SHA-256 mismatch');
|
|
948
|
+
let entries;
|
|
949
|
+
try {
|
|
950
|
+
entries = readZip(raw);
|
|
951
|
+
}
|
|
952
|
+
catch {
|
|
953
|
+
throw new ExtensionError('Invalid zip archive');
|
|
954
|
+
}
|
|
955
|
+
const files = entries.filter((e) => e.name && !e.isDir);
|
|
956
|
+
if (files.reduce((acc, e) => acc + e.size, 0) > MAX_ZIP_BYTES * 10)
|
|
957
|
+
throw new ExtensionError('Archive uncompressed size exceeds limit');
|
|
958
|
+
if (files.length > 1024)
|
|
959
|
+
throw new ExtensionError('Archive contains too many files');
|
|
960
|
+
const prefix = files.every((e) => e.name.startsWith(`${id}/`)) ? `${id}/` : '';
|
|
961
|
+
const stripped = (name) => (prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name);
|
|
962
|
+
const anchor = resolvePathLikePython(root);
|
|
963
|
+
const extDir = resolve(anchor, id);
|
|
1013
964
|
for (const e of files) {
|
|
1014
|
-
const
|
|
1015
|
-
|
|
965
|
+
const decoded = fullyUnquote(stripped(e.name));
|
|
966
|
+
if (!decoded || !isSafeArchiveMember(decoded))
|
|
967
|
+
throw new ExtensionError('Unsafe archive member');
|
|
968
|
+
const target = resolve(extDir, decoded);
|
|
969
|
+
if (!target.startsWith(anchor + sep) || !target.startsWith(extDir + sep))
|
|
970
|
+
throw new ExtensionError('Zip-slip detected');
|
|
971
|
+
}
|
|
972
|
+
let version = 'unknown';
|
|
973
|
+
for (const vfile of ['extension.json', 'manifest.json']) {
|
|
974
|
+
const entry = entries.find((e) => e.name === prefix + vfile);
|
|
975
|
+
if (!entry)
|
|
976
|
+
continue;
|
|
1016
977
|
try {
|
|
1017
|
-
|
|
978
|
+
const m = JSON.parse(entry.read().toString('utf8'));
|
|
979
|
+
if (isDict(m) && typeof m.version === 'string') {
|
|
980
|
+
version = m.version;
|
|
981
|
+
break;
|
|
982
|
+
}
|
|
1018
983
|
}
|
|
1019
|
-
catch
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
984
|
+
catch { /* ignore */ }
|
|
985
|
+
}
|
|
986
|
+
try {
|
|
987
|
+
if (lstatSync(extDir).isSymbolicLink())
|
|
988
|
+
throw new ExtensionError('Extension directory is a symlink', 400);
|
|
989
|
+
}
|
|
990
|
+
catch (error) {
|
|
991
|
+
if (error instanceof ExtensionError)
|
|
992
|
+
throw error;
|
|
993
|
+
}
|
|
994
|
+
try {
|
|
995
|
+
makeAnchoredDir(anchor, extDir);
|
|
996
|
+
}
|
|
997
|
+
catch {
|
|
998
|
+
throw new ExtensionError('Extension directory is a symlink', 400);
|
|
999
|
+
}
|
|
1000
|
+
const written = [];
|
|
1001
|
+
const rollback = () => {
|
|
1002
|
+
for (const p of written) {
|
|
1003
|
+
try {
|
|
1004
|
+
unlinkAnchored(anchor, p);
|
|
1005
|
+
}
|
|
1006
|
+
catch { /* gone */ }
|
|
1023
1007
|
}
|
|
1024
1008
|
try {
|
|
1025
|
-
|
|
1009
|
+
rmdirAnchored(anchor, extDir);
|
|
1026
1010
|
}
|
|
1027
|
-
|
|
1028
|
-
|
|
1011
|
+
catch { /* not empty, or gone */ }
|
|
1012
|
+
};
|
|
1013
|
+
try {
|
|
1014
|
+
// Every destination is created or truncated through the anchored walk from the extension root, so a symlink
|
|
1015
|
+
// already inside the extension (or a parent swapped mid-extraction) can never redirect a write outside it.
|
|
1016
|
+
for (const e of files) {
|
|
1017
|
+
const dest = resolve(extDir, fullyUnquote(stripped(e.name)));
|
|
1018
|
+
let fd;
|
|
1019
|
+
try {
|
|
1020
|
+
fd = openAnchoredCreateFd(anchor, dest);
|
|
1021
|
+
}
|
|
1022
|
+
catch (error) {
|
|
1023
|
+
if (!(error instanceof FileExistsError))
|
|
1024
|
+
throw error;
|
|
1025
|
+
fd = openAnchoredWriteFd(anchor, dest);
|
|
1026
|
+
}
|
|
1027
|
+
try {
|
|
1028
|
+
writeFileSync(fd, e.read());
|
|
1029
|
+
}
|
|
1030
|
+
finally {
|
|
1031
|
+
closeSync(fd);
|
|
1032
|
+
}
|
|
1033
|
+
written.push(dest);
|
|
1029
1034
|
}
|
|
1030
|
-
written.push(dest);
|
|
1031
1035
|
}
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
throw new ExtensionError('Extraction failed', 500);
|
|
1036
|
-
}
|
|
1037
|
-
try {
|
|
1038
|
-
const manifest = this.loadInstallManifest();
|
|
1039
|
-
const record = { version, files: written.map((p) => relative(extDir, p).split(sep).join('/')), installed_at: new Date().toISOString() };
|
|
1040
|
-
const next = { version: 1, installed: { ...manifest.installed, [id]: record } };
|
|
1041
|
-
if (Buffer.byteLength(JSON.stringify(next, null, 2)) > MAX_INSTALL_MANIFEST_BYTES)
|
|
1042
|
-
throw new ExtensionError('Install manifest would exceed size limit');
|
|
1043
|
-
this.writeInstallManifest(next);
|
|
1044
|
-
}
|
|
1045
|
-
catch (error) {
|
|
1046
|
-
rollback();
|
|
1047
|
-
throw error instanceof ExtensionError ? error : new ExtensionError('Failed to record install', 500);
|
|
1048
|
-
}
|
|
1049
|
-
return { installed: true, id, version };
|
|
1050
|
-
}
|
|
1051
|
-
uninstall(idRaw) {
|
|
1052
|
-
if (!validId(idRaw))
|
|
1053
|
-
throw new ExtensionError('Invalid extension id');
|
|
1054
|
-
const id = idRaw.trim();
|
|
1055
|
-
const root = this.root();
|
|
1056
|
-
if (!root)
|
|
1057
|
-
throw new ExtensionError('Extensions not configured', 404);
|
|
1058
|
-
const manifest = this.loadInstallManifest();
|
|
1059
|
-
const entry = manifest.installed[id];
|
|
1060
|
-
if (!entry)
|
|
1061
|
-
throw new ExtensionError('Extension not installed', 404);
|
|
1062
|
-
const anchor = resolvePathLikePython(root);
|
|
1063
|
-
const extDir = resolve(anchor, id);
|
|
1064
|
-
for (const rel of entry.files) {
|
|
1065
|
-
if (!isSafeArchiveMember(rel))
|
|
1066
|
-
continue;
|
|
1067
|
-
const target = resolve(extDir, rel);
|
|
1068
|
-
if (!target.startsWith(extDir + sep))
|
|
1069
|
-
continue;
|
|
1070
|
-
try {
|
|
1071
|
-
unlinkAnchored(anchor, target);
|
|
1036
|
+
catch {
|
|
1037
|
+
rollback();
|
|
1038
|
+
throw new ExtensionError('Extraction failed', 500);
|
|
1072
1039
|
}
|
|
1073
|
-
catch { /* gone */ }
|
|
1074
|
-
}
|
|
1075
|
-
// Prune now-empty directories, enumerating and removing each through the anchored walk so a directory replaced by
|
|
1076
|
-
// a symlink is skipped rather than followed into its target.
|
|
1077
|
-
const prune = (dir) => {
|
|
1078
|
-
let subdirs;
|
|
1079
1040
|
try {
|
|
1080
|
-
|
|
1041
|
+
const manifest = (await this.loadInstallManifest());
|
|
1042
|
+
const record = { version, files: written.map((p) => relative(extDir, p).split(sep).join('/')), installed_at: new Date().toISOString() };
|
|
1043
|
+
const next = { version: 1, installed: { ...manifest.installed, [id]: record } };
|
|
1044
|
+
if (Buffer.byteLength(JSON.stringify(next, null, 2)) > MAX_INSTALL_MANIFEST_BYTES)
|
|
1045
|
+
throw new ExtensionError('Install manifest would exceed size limit');
|
|
1046
|
+
await this.writeInstallManifest(next);
|
|
1081
1047
|
}
|
|
1082
|
-
catch {
|
|
1083
|
-
|
|
1048
|
+
catch (error) {
|
|
1049
|
+
rollback();
|
|
1050
|
+
throw error instanceof ExtensionError ? error : new ExtensionError('Failed to record install', 500);
|
|
1084
1051
|
}
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1052
|
+
return { installed: true, id, version };
|
|
1053
|
+
});
|
|
1054
|
+
}
|
|
1055
|
+
async uninstall(idRaw) {
|
|
1056
|
+
return await this.mutateState(async () => {
|
|
1057
|
+
if (!validId(idRaw))
|
|
1058
|
+
throw new ExtensionError('Invalid extension id');
|
|
1059
|
+
const id = idRaw.trim();
|
|
1060
|
+
const root = this.root();
|
|
1061
|
+
if (!root)
|
|
1062
|
+
throw new ExtensionError('Extensions not configured', 404);
|
|
1063
|
+
const manifest = (await this.loadInstallManifest());
|
|
1064
|
+
const entry = manifest.installed[id];
|
|
1065
|
+
if (!entry)
|
|
1066
|
+
throw new ExtensionError('Extension not installed', 404);
|
|
1067
|
+
const anchor = resolvePathLikePython(root);
|
|
1068
|
+
const extDir = resolve(anchor, id);
|
|
1069
|
+
for (const rel of entry.files) {
|
|
1070
|
+
if (!isSafeArchiveMember(rel))
|
|
1071
|
+
continue;
|
|
1072
|
+
const target = resolve(extDir, rel);
|
|
1073
|
+
if (!target.startsWith(extDir + sep))
|
|
1074
|
+
continue;
|
|
1075
|
+
try {
|
|
1076
|
+
unlinkAnchored(anchor, target);
|
|
1077
|
+
}
|
|
1078
|
+
catch { /* gone */ }
|
|
1089
1079
|
}
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1080
|
+
// Prune now-empty directories, enumerating and removing each through the anchored walk so a directory replaced by
|
|
1081
|
+
// a symlink is skipped rather than followed into its target.
|
|
1082
|
+
const prune = (dir) => {
|
|
1083
|
+
let subdirs;
|
|
1084
|
+
try {
|
|
1085
|
+
subdirs = withAnchoredDir(anchor, dir, (child) => readdirSync(child('.'), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name));
|
|
1086
|
+
}
|
|
1087
|
+
catch {
|
|
1088
|
+
return;
|
|
1089
|
+
}
|
|
1090
|
+
for (const name of subdirs)
|
|
1091
|
+
prune(join(dir, name));
|
|
1092
|
+
try {
|
|
1093
|
+
rmdirAnchored(anchor, dir);
|
|
1094
|
+
}
|
|
1095
|
+
catch { /* not empty, or gone */ }
|
|
1096
|
+
};
|
|
1097
|
+
prune(extDir);
|
|
1098
|
+
Reflect.deleteProperty(manifest.installed, id);
|
|
1099
|
+
await this.writeInstallManifest(manifest);
|
|
1100
|
+
return { uninstalled: true, id };
|
|
1101
|
+
});
|
|
1096
1102
|
}
|
|
1097
1103
|
/** Python `serve_extension_static`: bytes, MIME, sandbox CSP for HTML; null means 404. */
|
|
1098
1104
|
staticFile(rel) {
|