@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/sessions/relay.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { filterAsync } from '../util.js';
|
|
1
2
|
/**
|
|
2
3
|
* Talaria Relay: publisher pairing, profile enrollment, browser presence
|
|
3
4
|
* leases, and the best-effort snapshot publisher (Python
|
|
@@ -8,9 +9,9 @@
|
|
|
8
9
|
*/
|
|
9
10
|
import { readCapped } from '../http/capped.js';
|
|
10
11
|
import { createHash, createPrivateKey, generateKeyPairSync, randomUUID, sign as cryptoSign } from 'node:crypto';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { updateDocument } from './storage/document.js';
|
|
14
15
|
import { str } from '../util.js';
|
|
15
16
|
export const PRESENCE_LEASE_SECONDS = 90;
|
|
16
17
|
export const PRESENCE_MAX_LEASES = 256;
|
|
@@ -55,13 +56,12 @@ export function validatedOrigin(raw, httpsOnly = false) {
|
|
|
55
56
|
}
|
|
56
57
|
return value;
|
|
57
58
|
}
|
|
58
|
-
export function relayStatePath(stateDir) { return join(stateDir, 'talaria-relay.json'); }
|
|
59
59
|
/** Python `RelayConfig.from_state`: null when absent or a v1 file (registration is required again); throws on corruption. */
|
|
60
|
-
export function loadRelayConfig(
|
|
61
|
-
const
|
|
62
|
-
if (!
|
|
60
|
+
export async function loadRelayConfig(documents) {
|
|
61
|
+
const record = await documents.get('relay', 'config');
|
|
62
|
+
if (!record)
|
|
63
63
|
return null;
|
|
64
|
-
const values =
|
|
64
|
+
const values = record.value;
|
|
65
65
|
if (!values || typeof values !== 'object' || Array.isArray(values))
|
|
66
66
|
throw new Error('saved relay configuration is not an object');
|
|
67
67
|
const v = values;
|
|
@@ -77,32 +77,54 @@ export function loadRelayConfig(stateDir) {
|
|
|
77
77
|
throw new Error('saved relay profiles are invalid');
|
|
78
78
|
normalized[name] = { identity: p.identity, profile_id: p.profile_id };
|
|
79
79
|
}
|
|
80
|
-
return { url: validatedOrigin(str(v.url)), publisher_id: validatedOrigin(str(v.publisher_id)), key_id: str(v.key_id), private_key_path: str(v.private_key_path), profiles: normalized };
|
|
80
|
+
return { url: validatedOrigin(str(v.url)), publisher_id: validatedOrigin(str(v.publisher_id)), key_id: str(v.key_id), private_key_path: str(v.private_key_path), ...(typeof v.private_key_document === 'string' ? { private_key_document: v.private_key_document } : {}), profiles: normalized };
|
|
81
81
|
}
|
|
82
|
-
export function saveRelayConfig(
|
|
82
|
+
export async function saveRelayConfig(documents, config) {
|
|
83
83
|
const payload = { key_id: config.key_id, private_key_path: config.private_key_path, profiles: sortedProfiles(config.profiles), publisher_id: config.publisher_id, url: config.url, version: 2 };
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
const value = { ...payload, ...(config.private_key_document ? { private_key_document: config.private_key_document } : {}) };
|
|
85
|
+
await updateDocument(documents, 'relay', 'config', () => ({ value, result: undefined }), { replaceInvalid: true });
|
|
86
86
|
}
|
|
87
87
|
function sortedProfiles(profiles) {
|
|
88
88
|
return Object.fromEntries(Object.keys(profiles).sort().map((k) => [k, { identity: profiles[k].identity, profile_id: profiles[k].profile_id }]));
|
|
89
89
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return identity;
|
|
90
|
+
// The started ledger records announcements; deletions need a separate, non-expiring delivery outbox.
|
|
91
|
+
const DeletedViewSchema = z.object({
|
|
92
|
+
id: z.string().min(1), sessionId: z.string().min(1), profile: z.string().min(1),
|
|
93
|
+
through: z.number().int().nonnegative(), identity: z.string().nullable(),
|
|
94
|
+
scope: z.object({ url: z.string(), publisherId: z.string(), profileId: z.string() }).nullable(),
|
|
95
|
+
});
|
|
96
|
+
const DeletedViewsSchema = z.object({ version: z.literal(1), views: z.array(DeletedViewSchema) });
|
|
97
|
+
// A staged deletion cannot clear a session that survived a failed removal or a restart before removal.
|
|
98
|
+
async function hasSessionData(store, sid) {
|
|
99
|
+
if (store.sessions.has(sid))
|
|
100
|
+
return true;
|
|
101
|
+
return (await store.exists(sid));
|
|
103
102
|
}
|
|
104
|
-
function
|
|
105
|
-
|
|
103
|
+
function parseDeletedViews(raw) { return raw === undefined ? [] : DeletedViewsSchema.parse(raw).views; }
|
|
104
|
+
async function loadDeletedViews(documents) { return parseDeletedViews((await documents.get('relay', 'deleted'))?.value); }
|
|
105
|
+
async function mutateDeletedViews(documents, edit) {
|
|
106
|
+
return (await updateDocument(documents, 'relay', 'deleted', async (raw) => {
|
|
107
|
+
const views = parseDeletedViews(raw);
|
|
108
|
+
const result = await edit(views);
|
|
109
|
+
return { value: { version: 1, views }, result };
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
/** The profile identity lives in the selected backend, with the JSON adapter retaining its old private file. */
|
|
113
|
+
export async function profileIdentity(deps, profile) {
|
|
114
|
+
if (!statSync(deps.profileHome(profile)).isDirectory())
|
|
115
|
+
throw new Error('Hermes profile is unavailable');
|
|
116
|
+
return (await updateDocument(deps.documents, 'relay-identities', profile, (raw) => {
|
|
117
|
+
const identity = typeof raw === 'string' ? raw.trim() : `pfi_${randomUUID().replace(/-/g, '')}`;
|
|
118
|
+
if (!/^pfi_[0-9a-f]{32}$/.test(identity))
|
|
119
|
+
throw new Error('invalid Talaria Relay profile identity');
|
|
120
|
+
return { value: typeof raw === 'string' ? raw : identity + '\n', result: identity };
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
async function loadKey(documents, config) {
|
|
124
|
+
const value = config.private_key_document ? (await documents.get('relay-keys', config.private_key_document))?.value : readFileSync(config.private_key_path, 'utf8');
|
|
125
|
+
if (typeof value !== 'string')
|
|
126
|
+
throw new Error('Talaria publisher key is missing');
|
|
127
|
+
const key = createPrivateKey(value);
|
|
106
128
|
if (key.asymmetricKeyType !== 'ed25519')
|
|
107
129
|
throw new Error('Talaria publisher key must be an Ed25519 private key');
|
|
108
130
|
return key;
|
|
@@ -172,8 +194,6 @@ export class RelayPublisher {
|
|
|
172
194
|
config;
|
|
173
195
|
deps;
|
|
174
196
|
key;
|
|
175
|
-
revisionPath;
|
|
176
|
-
startedPath;
|
|
177
197
|
startedUnsupportedLogged = false;
|
|
178
198
|
lastRevision = 0;
|
|
179
199
|
terminal = new Map();
|
|
@@ -190,18 +210,15 @@ export class RelayPublisher {
|
|
|
190
210
|
constructor(config, deps) {
|
|
191
211
|
this.config = config;
|
|
192
212
|
this.deps = deps;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
this.
|
|
196
|
-
// Tracking starts now, before any session event can wake the first pass, so the chat that wakes it is announced.
|
|
213
|
+
}
|
|
214
|
+
async initialize() {
|
|
215
|
+
this.key = await loadKey(this.deps.documents, this.config);
|
|
197
216
|
try {
|
|
198
|
-
|
|
199
|
-
if (this.trackProfiles(ledger))
|
|
200
|
-
this.saveStarted(ledger);
|
|
217
|
+
await this.mutateStarted((ledger) => { this.trackProfiles(ledger); });
|
|
201
218
|
}
|
|
202
|
-
catch { /* the first pass
|
|
219
|
+
catch { /* the first pass retries */ }
|
|
203
220
|
try {
|
|
204
|
-
this.lastRevision = Number.parseInt(
|
|
221
|
+
this.lastRevision = Number.parseInt(str((await this.deps.documents.get('relay', 'revision'))?.value), 10) || 0;
|
|
205
222
|
}
|
|
206
223
|
catch {
|
|
207
224
|
this.lastRevision = 0;
|
|
@@ -215,11 +232,11 @@ export class RelayPublisher {
|
|
|
215
232
|
this.views.set(sid, view);
|
|
216
233
|
this.lastRevision = Math.max(this.lastRevision, previous.lastRevision);
|
|
217
234
|
}
|
|
218
|
-
start(publishInitial = true) {
|
|
235
|
+
async start(publishInitial = true) {
|
|
219
236
|
if (this.loop)
|
|
220
237
|
return;
|
|
221
238
|
this.loop = this.run();
|
|
222
|
-
if (publishInitial)
|
|
239
|
+
if (publishInitial || (await loadDeletedViews(this.deps.documents)).length)
|
|
223
240
|
this.changed();
|
|
224
241
|
}
|
|
225
242
|
stop() {
|
|
@@ -247,15 +264,37 @@ export class RelayPublisher {
|
|
|
247
264
|
this.views.set(sid, { profile, through: Math.floor(this.deps.now() * 1000) });
|
|
248
265
|
this.changed();
|
|
249
266
|
}
|
|
267
|
+
/** Bind an unconfigured deletion once, before sending, so retries cannot cross relay or profile identities. */
|
|
268
|
+
async pendingDeleted() {
|
|
269
|
+
const views = await mutateDeletedViews(this.deps.documents, async (views) => {
|
|
270
|
+
for (const view of views) {
|
|
271
|
+
if (view.scope)
|
|
272
|
+
continue;
|
|
273
|
+
const cfg = this.config.profiles[view.profile];
|
|
274
|
+
if (!cfg || (view.identity !== null && cfg.identity !== view.identity) || !await this.publishes(view.profile, cfg))
|
|
275
|
+
continue;
|
|
276
|
+
view.identity = cfg.identity;
|
|
277
|
+
view.scope = { url: this.config.url, publisherId: this.config.publisher_id, profileId: cfg.profile_id };
|
|
278
|
+
}
|
|
279
|
+
return views;
|
|
280
|
+
});
|
|
281
|
+
return filterAsync(views, async (view) => !await hasSessionData(this.deps.store, view.sessionId));
|
|
282
|
+
}
|
|
250
283
|
/** Send the views queued before the snapshot just published, so the relay already holds every outcome they saw. */
|
|
251
284
|
async flushViews(ready) {
|
|
252
285
|
for (const [sid, view] of ready) {
|
|
286
|
+
if (view.deleted && (await hasSessionData(this.deps.store, sid)))
|
|
287
|
+
continue;
|
|
288
|
+
let accepted = false;
|
|
253
289
|
for (const [profile, cfg] of Object.entries(this.config.profiles)) {
|
|
254
|
-
if (!this.deps.profilesMatch(view.profile, profile) || !this.publishes(profile, cfg))
|
|
290
|
+
if (!this.deps.profilesMatch(view.profile, profile) || !(await this.publishes(profile, cfg)))
|
|
291
|
+
continue;
|
|
292
|
+
if (view.deleted && (view.deleted.identity !== cfg.identity || view.deleted.scope?.url !== this.config.url || view.deleted.scope.publisherId !== this.config.publisher_id || view.deleted.scope.profileId !== cfg.profile_id))
|
|
255
293
|
continue;
|
|
256
294
|
const path = `/v1/publishers/${encodeURIComponent(this.config.publisher_id)}/profiles/${encodeURIComponent(cfg.profile_id)}/sessions/${encodeURIComponent(sid)}/viewed`;
|
|
257
295
|
try {
|
|
258
296
|
await this.put(path, JSON.stringify({ through: view.through }));
|
|
297
|
+
accepted = true;
|
|
259
298
|
}
|
|
260
299
|
catch (error) {
|
|
261
300
|
if (!(error instanceof RelayHttpError) || error.retryable)
|
|
@@ -268,7 +307,12 @@ export class RelayPublisher {
|
|
|
268
307
|
this.deps.log(`[relay] Talaria relay rejected a viewed acknowledgement (HTTP ${String(error.status)})`);
|
|
269
308
|
}
|
|
270
309
|
}
|
|
271
|
-
if (
|
|
310
|
+
if (view.deleted) {
|
|
311
|
+
if (accepted)
|
|
312
|
+
await mutateDeletedViews(this.deps.documents, (views) => { const index = views.findIndex((entry) => entry.id === view.deleted.id && entry.through === view.through); if (index >= 0)
|
|
313
|
+
views.splice(index, 1); });
|
|
314
|
+
}
|
|
315
|
+
else if (this.views.get(sid) === view)
|
|
272
316
|
this.views.delete(sid);
|
|
273
317
|
}
|
|
274
318
|
}
|
|
@@ -292,7 +336,7 @@ export class RelayPublisher {
|
|
|
292
336
|
return;
|
|
293
337
|
this.dirty = false;
|
|
294
338
|
try {
|
|
295
|
-
const ready =
|
|
339
|
+
const ready = [...this.views, ...(await this.pendingDeleted()).map((view) => [view.sessionId, { profile: view.profile, through: view.through, deleted: view }])];
|
|
296
340
|
await this.publishSnapshot(true);
|
|
297
341
|
await this.flushViews(ready);
|
|
298
342
|
await this.publishStarted();
|
|
@@ -315,7 +359,7 @@ export class RelayPublisher {
|
|
|
315
359
|
}
|
|
316
360
|
}
|
|
317
361
|
/** Python `build_states`: one row per session with a live or recently terminal run in this profile. */
|
|
318
|
-
buildStates(profile) {
|
|
362
|
+
async buildStates(profile) {
|
|
319
363
|
const cutoff = this.deps.now() - TERMINAL_RETENTION_S;
|
|
320
364
|
for (const [sid, run] of this.terminal)
|
|
321
365
|
if (run.terminal_at < cutoff)
|
|
@@ -339,7 +383,7 @@ export class RelayPublisher {
|
|
|
339
383
|
for (const [sid, run] of bySession) {
|
|
340
384
|
let session;
|
|
341
385
|
try {
|
|
342
|
-
session = this.deps.store.get(sid, { metadataOnly: true });
|
|
386
|
+
session = (await this.deps.store.get(sid, { metadataOnly: true }));
|
|
343
387
|
}
|
|
344
388
|
catch {
|
|
345
389
|
continue;
|
|
@@ -362,13 +406,22 @@ export class RelayPublisher {
|
|
|
362
406
|
states.push(state);
|
|
363
407
|
}
|
|
364
408
|
if (states.length)
|
|
365
|
-
|
|
409
|
+
await updateDocument(this.deps.documents, 'relay', 'revision', (raw) => {
|
|
410
|
+
let floor = Number.parseInt(str(raw), 10) || 0;
|
|
411
|
+
for (const state of states) {
|
|
412
|
+
state.revision = Math.max(state.revision, floor + 1);
|
|
413
|
+
state.eventId = `snapshot:${String(state.revision)}:${state.sessionId}`;
|
|
414
|
+
floor = state.revision;
|
|
415
|
+
}
|
|
416
|
+
this.lastRevision = Math.max(this.lastRevision, floor);
|
|
417
|
+
return { value: `${String(this.lastRevision)}\n`, result: undefined };
|
|
418
|
+
});
|
|
366
419
|
return states;
|
|
367
420
|
}
|
|
368
421
|
async publishSnapshot(isolatePermanent = false) {
|
|
369
422
|
let retryable = null;
|
|
370
423
|
for (const [profile, cfg] of Object.entries(this.config.profiles)) {
|
|
371
|
-
if (!this.publishes(profile, cfg))
|
|
424
|
+
if (!(await this.publishes(profile, cfg)))
|
|
372
425
|
continue;
|
|
373
426
|
try {
|
|
374
427
|
await this.publishProfileSnapshot(profile, cfg.profile_id);
|
|
@@ -387,10 +440,10 @@ export class RelayPublisher {
|
|
|
387
440
|
if (retryable)
|
|
388
441
|
throw retryable;
|
|
389
442
|
}
|
|
390
|
-
publishes(profile, cfg) {
|
|
443
|
+
async publishes(profile, cfg) {
|
|
391
444
|
if (cfg.identity) {
|
|
392
445
|
try {
|
|
393
|
-
if (profileIdentity(this.deps
|
|
446
|
+
if ((await profileIdentity(this.deps, profile)) !== cfg.identity)
|
|
394
447
|
return false;
|
|
395
448
|
}
|
|
396
449
|
catch {
|
|
@@ -404,7 +457,7 @@ export class RelayPublisher {
|
|
|
404
457
|
for (const [profile, cfg] of Object.entries(this.config.profiles)) {
|
|
405
458
|
if (cfg.profile_id !== profileId)
|
|
406
459
|
continue;
|
|
407
|
-
if (cfg.identity !== expectedIdentity || profileIdentity(this.deps
|
|
460
|
+
if (cfg.identity !== expectedIdentity || (await profileIdentity(this.deps, profile)) !== expectedIdentity)
|
|
408
461
|
throw new RelayPairingError('Hermes profile changed during relay enrollment', 409);
|
|
409
462
|
await this.publishProfileSnapshot(profile, profileId);
|
|
410
463
|
return;
|
|
@@ -412,15 +465,8 @@ export class RelayPublisher {
|
|
|
412
465
|
throw new RelayPairingError('Talaria Relay profile enrollment is unavailable', 502);
|
|
413
466
|
}
|
|
414
467
|
// The ledger is reread for every change, so a restarted or replacement publisher resends an unsent event under its ID.
|
|
415
|
-
|
|
468
|
+
parseStarted(raw) {
|
|
416
469
|
const ledger = new Map();
|
|
417
|
-
let raw;
|
|
418
|
-
try {
|
|
419
|
-
raw = JSON.parse(readFileSync(this.startedPath, 'utf8'));
|
|
420
|
-
}
|
|
421
|
-
catch {
|
|
422
|
-
return ledger;
|
|
423
|
-
}
|
|
424
470
|
const profiles = raw?.profiles;
|
|
425
471
|
if (!Array.isArray(profiles))
|
|
426
472
|
return ledger;
|
|
@@ -436,9 +482,16 @@ export class RelayPublisher {
|
|
|
436
482
|
}
|
|
437
483
|
return ledger;
|
|
438
484
|
}
|
|
439
|
-
|
|
485
|
+
startedDocument(ledger) {
|
|
440
486
|
const profiles = [...ledger].map(([profileId, p]) => ({ profileId, floor: p.floor, sessions: [...p.sessions].map(([sessionId, e]) => ({ sessionId, startedAt: e.startedAt, sent: e.sent })) }));
|
|
441
|
-
|
|
487
|
+
return { version: 1, profiles };
|
|
488
|
+
}
|
|
489
|
+
async mutateStarted(edit) {
|
|
490
|
+
return (await updateDocument(this.deps.documents, 'relay', 'started', async (raw) => {
|
|
491
|
+
const ledger = this.parseStarted(raw);
|
|
492
|
+
const result = await edit(ledger);
|
|
493
|
+
return { value: this.startedDocument(ledger), result };
|
|
494
|
+
}, { replaceInvalid: true }));
|
|
442
495
|
}
|
|
443
496
|
/** Give each enrolled profile without a ledger entry a floor of now; true when the ledger changed. */
|
|
444
497
|
trackProfiles(ledger) {
|
|
@@ -457,7 +510,7 @@ export class RelayPublisher {
|
|
|
457
510
|
// Agent rows come from the listing worker first, so the ledger's load-to-save stays synchronous.
|
|
458
511
|
const agentRows = new Map();
|
|
459
512
|
for (const [profile, cfg] of Object.entries(this.config.profiles)) {
|
|
460
|
-
if (!this.publishes(profile, cfg))
|
|
513
|
+
if (!(await this.publishes(profile, cfg)))
|
|
461
514
|
continue;
|
|
462
515
|
try {
|
|
463
516
|
agentRows.set(profile, await this.deps.agentSessions(profile));
|
|
@@ -466,50 +519,49 @@ export class RelayPublisher {
|
|
|
466
519
|
agentRows.set(profile, []);
|
|
467
520
|
}
|
|
468
521
|
}
|
|
469
|
-
const ledger = this.loadStarted();
|
|
470
|
-
const nowMs = Math.floor(this.deps.now() * 1000);
|
|
471
|
-
let changed = this.trackProfiles(ledger);
|
|
472
522
|
let index = [];
|
|
473
523
|
try {
|
|
474
|
-
index = this.deps.store.readIndexEntries();
|
|
475
|
-
}
|
|
476
|
-
catch {
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
const
|
|
483
|
-
|
|
484
|
-
for (const [
|
|
485
|
-
if (
|
|
486
|
-
entry.sessions.delete(sid);
|
|
487
|
-
changed = true;
|
|
488
|
-
}
|
|
489
|
-
// A compressed Agent chat keeps its lineage root's id and start, so later segments are not new sessions.
|
|
490
|
-
const agent = agentRows.get(profile) ?? [];
|
|
491
|
-
const seen = [
|
|
492
|
-
...index.filter((row) => Number(row.message_count) > 0 && this.deps.profilesMatch(row.profile, profile)).map((row) => [row.session_id, row.created_at]),
|
|
493
|
-
...agent.map((row) => [row._lineage_root_id || row.id, row.started_at]),
|
|
494
|
-
];
|
|
495
|
-
for (const [rawSid, created] of seen) {
|
|
496
|
-
const sid = str(rawSid).trim();
|
|
497
|
-
const startedAt = Math.floor(Number(created) * 1000);
|
|
498
|
-
if (!sid || sid.length > 191 || !Number.isSafeInteger(startedAt) || startedAt < floor || entry.sessions.has(sid))
|
|
524
|
+
index = await this.deps.store.readIndexEntries();
|
|
525
|
+
}
|
|
526
|
+
catch { /* no resident index */ }
|
|
527
|
+
const eligible = new Set();
|
|
528
|
+
for (const [profile, cfg] of Object.entries(this.config.profiles))
|
|
529
|
+
if (await this.publishes(profile, cfg))
|
|
530
|
+
eligible.add(profile);
|
|
531
|
+
return (await this.mutateStarted((ledger) => {
|
|
532
|
+
const nowMs = Math.floor(this.deps.now() * 1000);
|
|
533
|
+
this.trackProfiles(ledger);
|
|
534
|
+
for (const [profile, cfg] of Object.entries(this.config.profiles)) {
|
|
535
|
+
if (!eligible.has(profile))
|
|
499
536
|
continue;
|
|
500
|
-
entry.
|
|
501
|
-
|
|
537
|
+
const entry = ledger.get(cfg.profile_id);
|
|
538
|
+
const floor = Math.max(entry.floor, nowMs - STARTED_WINDOW_MS);
|
|
539
|
+
for (const [sid, e] of entry.sessions)
|
|
540
|
+
if (e.startedAt < floor) {
|
|
541
|
+
entry.sessions.delete(sid);
|
|
542
|
+
}
|
|
543
|
+
// A compressed Agent chat keeps its lineage root's id and start, so later segments are not new sessions.
|
|
544
|
+
const agent = agentRows.get(profile) ?? [];
|
|
545
|
+
const seen = [
|
|
546
|
+
...index.filter((row) => Number(row.message_count) > 0 && this.deps.profilesMatch(row.profile, profile)).map((row) => [row.session_id, row.created_at]),
|
|
547
|
+
...agent.map((row) => [row._lineage_root_id || row.id, row.started_at]),
|
|
548
|
+
];
|
|
549
|
+
for (const [rawSid, created] of seen) {
|
|
550
|
+
const sid = str(rawSid).trim();
|
|
551
|
+
const startedAt = Math.floor(Number(created) * 1000);
|
|
552
|
+
if (!sid || sid.length > 191 || !Number.isSafeInteger(startedAt) || startedAt < floor || entry.sessions.has(sid))
|
|
553
|
+
continue;
|
|
554
|
+
entry.sessions.set(sid, { startedAt, sent: false });
|
|
555
|
+
}
|
|
502
556
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
this.saveStarted(ledger);
|
|
506
|
-
return ledger;
|
|
557
|
+
return ledger;
|
|
558
|
+
}));
|
|
507
559
|
}
|
|
508
560
|
/** Announce each newly observed session once, oldest first, to the relay scope of the profile that owns it. */
|
|
509
561
|
async publishStarted() {
|
|
510
562
|
const ledger = await this.observeStarted();
|
|
511
563
|
for (const [profile, cfg] of Object.entries(this.config.profiles)) {
|
|
512
|
-
if (!this.publishes(profile, cfg))
|
|
564
|
+
if (!(await this.publishes(profile, cfg)))
|
|
513
565
|
continue;
|
|
514
566
|
const unsent = [...(ledger.get(cfg.profile_id)?.sessions ?? [])].filter(([, e]) => !e.sent).sort((a, b) => a[1].startedAt - b[1].startedAt);
|
|
515
567
|
for (const [sid, e] of unsent) {
|
|
@@ -528,17 +580,13 @@ export class RelayPublisher {
|
|
|
528
580
|
this.deps.log('[relay] Talaria relay does not support session-started events (HTTP 404); devices refresh on their own schedule');
|
|
529
581
|
}
|
|
530
582
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
if (sent && !sent.sent) {
|
|
534
|
-
sent.sent = true;
|
|
535
|
-
this.saveStarted(latest);
|
|
536
|
-
}
|
|
583
|
+
await this.mutateStarted((latest) => { const sent = latest.get(cfg.profile_id)?.sessions.get(sid); if (sent)
|
|
584
|
+
sent.sent = true; });
|
|
537
585
|
}
|
|
538
586
|
}
|
|
539
587
|
}
|
|
540
588
|
async publishProfileSnapshot(profile, profileId) {
|
|
541
|
-
const states = this.buildStates(profile);
|
|
589
|
+
const states = (await this.buildStates(profile));
|
|
542
590
|
try {
|
|
543
591
|
await this.putSnapshot(profileId, states);
|
|
544
592
|
}
|
|
@@ -584,18 +632,19 @@ export class RelayService {
|
|
|
584
632
|
}
|
|
585
633
|
current() { return this.publisher; }
|
|
586
634
|
/** Python `start_talaria_relay_publisher`: resume from saved state; invalid state disables the publisher. */
|
|
587
|
-
start() {
|
|
635
|
+
async start() {
|
|
588
636
|
if (this.publisher)
|
|
589
637
|
return true;
|
|
590
638
|
let candidate = null;
|
|
591
639
|
try {
|
|
592
|
-
const config = loadRelayConfig(this.deps.
|
|
640
|
+
const config = (await loadRelayConfig(this.deps.documents));
|
|
593
641
|
if (!config)
|
|
594
642
|
return false;
|
|
595
643
|
candidate = new RelayPublisher(config, this.deps);
|
|
644
|
+
await candidate.initialize();
|
|
596
645
|
this.candidate = candidate;
|
|
597
646
|
this.adopt(candidate, null);
|
|
598
|
-
candidate.start(false);
|
|
647
|
+
await candidate.start(false);
|
|
599
648
|
return true;
|
|
600
649
|
}
|
|
601
650
|
catch (error) {
|
|
@@ -625,21 +674,50 @@ export class RelayService {
|
|
|
625
674
|
}
|
|
626
675
|
}
|
|
627
676
|
/** A viewed session clears its finished runs on the relay; without a publisher there is nothing to clear. */
|
|
628
|
-
markViewed(sid) {
|
|
677
|
+
async markViewed(sid) {
|
|
629
678
|
const publisher = this.publisher ?? this.candidate;
|
|
630
|
-
publisher?.markViewed(sid, this.deps.store.get(sid, { metadataOnly: true }).profile);
|
|
679
|
+
publisher?.markViewed(sid, (await this.deps.store.get(sid, { metadataOnly: true })).profile);
|
|
631
680
|
}
|
|
632
|
-
/**
|
|
633
|
-
|
|
634
|
-
* store no longer knows it). Later lookups of the same id do not resend.
|
|
635
|
-
*/
|
|
636
|
-
clearDeleted(sid, profile) {
|
|
681
|
+
/** Persist before reporting successful deletion, even when publication is unavailable. */
|
|
682
|
+
async clearDeleted(sid, profile) {
|
|
637
683
|
const publisher = this.publisher ?? this.candidate;
|
|
638
|
-
|
|
684
|
+
const name = this.deps.canonicalProfile(profile ?? 'default');
|
|
685
|
+
const key = JSON.stringify([name, sid]);
|
|
686
|
+
const live = (await hasSessionData(this.deps.store, sid));
|
|
687
|
+
if (!live && this.clearedDeleted.has(key))
|
|
639
688
|
return;
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
689
|
+
await mutateDeletedViews(this.deps.documents, async (views) => {
|
|
690
|
+
const queued = views.find((view) => view.sessionId === sid && view.profile === name);
|
|
691
|
+
if (queued && live) {
|
|
692
|
+
const through = Math.max(queued.through, Math.floor(this.deps.now() * 1000));
|
|
693
|
+
if (through !== queued.through) {
|
|
694
|
+
queued.through = through;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
else if (!queued) {
|
|
698
|
+
let config = publisher?.config ?? null;
|
|
699
|
+
if (!config) {
|
|
700
|
+
try {
|
|
701
|
+
config = (await loadRelayConfig(this.deps.documents));
|
|
702
|
+
}
|
|
703
|
+
catch { /* preserve unconfigured cleanup */ }
|
|
704
|
+
}
|
|
705
|
+
const cfg = config?.profiles[name];
|
|
706
|
+
let identity = cfg?.identity ?? null;
|
|
707
|
+
if (identity === null) {
|
|
708
|
+
try {
|
|
709
|
+
identity = (await profileIdentity(this.deps, name));
|
|
710
|
+
}
|
|
711
|
+
catch { /* bind when this profile becomes available */ }
|
|
712
|
+
}
|
|
713
|
+
views.push({
|
|
714
|
+
id: randomUUID(), sessionId: sid, profile: name, through: Math.floor(this.deps.now() * 1000), identity,
|
|
715
|
+
scope: config && cfg ? { url: config.url, publisherId: config.publisher_id, profileId: cfg.profile_id } : null,
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
this.clearedDeleted.add(key);
|
|
720
|
+
publisher?.changed();
|
|
643
721
|
}
|
|
644
722
|
/** Terminal turn events reach the relay even mid-swap (Python `note_talaria_terminal`). */
|
|
645
723
|
noteTerminal(streamId, phase) {
|
|
@@ -654,6 +732,7 @@ export class RelayService {
|
|
|
654
732
|
/** Python `configure_talaria_relay_publisher`: validate with a real snapshot before swapping publishers. */
|
|
655
733
|
async configure(config, validate) {
|
|
656
734
|
const candidate = new RelayPublisher(config, this.deps);
|
|
735
|
+
await candidate.initialize();
|
|
657
736
|
const previous = this.publisher;
|
|
658
737
|
this.candidate = candidate;
|
|
659
738
|
if (previous)
|
|
@@ -670,7 +749,7 @@ export class RelayService {
|
|
|
670
749
|
throw new RelayPairingError(error instanceof RelayPairingError ? error.message : 'Could not publish the initial Talaria Relay snapshot', error instanceof RelayPairingError ? error.status : 502);
|
|
671
750
|
}
|
|
672
751
|
this.adopt(candidate, previous);
|
|
673
|
-
candidate.start(false);
|
|
752
|
+
await candidate.start(false);
|
|
674
753
|
candidate.changed();
|
|
675
754
|
}
|
|
676
755
|
/** Python `pair_talaria_relay`, serialised so concurrent enrollments preserve both mappings. */
|
|
@@ -730,12 +809,12 @@ export class RelayService {
|
|
|
730
809
|
let identity;
|
|
731
810
|
try {
|
|
732
811
|
canonical = this.deps.canonicalProfile(profile);
|
|
733
|
-
identity = profileIdentity(this.deps
|
|
812
|
+
identity = (await profileIdentity(this.deps, canonical));
|
|
734
813
|
}
|
|
735
814
|
catch {
|
|
736
815
|
throw new RelayPairingError('Hermes profile is unavailable', 403);
|
|
737
816
|
}
|
|
738
|
-
const existing = loadRelayConfig(this.deps.
|
|
817
|
+
const existing = (await loadRelayConfig(this.deps.documents));
|
|
739
818
|
if (existing) {
|
|
740
819
|
if (existing.url !== relayUrl || existing.publisher_id !== publisherId)
|
|
741
820
|
throw new RelayPairingError('This Hermes server is registered to a different relay', 409);
|
|
@@ -743,11 +822,11 @@ export class RelayService {
|
|
|
743
822
|
const profileId = known?.identity === identity ? known.profile_id : `prf_${randomUUID().replace(/-/g, '')}`;
|
|
744
823
|
const requestBody = JSON.stringify({ invitation, publisherId, profileId });
|
|
745
824
|
const path = '/v1/pairings/profile/redeem';
|
|
746
|
-
const payload = await this.relayPost(existing.url + path, requestBody, signedHeaders(loadKey(existing
|
|
825
|
+
const payload = await this.relayPost(existing.url + path, requestBody, signedHeaders((await loadKey(this.deps.documents, existing)), existing.key_id, 'POST', path, requestBody, this.deps.now), 'Talaria Relay rejected the profile enrollment');
|
|
747
826
|
if (payload.protocolVersion !== 2 || payload.publisherId !== publisherId || payload.profileId !== profileId)
|
|
748
827
|
throw new RelayPairingError('Talaria Relay returned an invalid response', 502);
|
|
749
828
|
const config = { ...existing, profiles: { ...existing.profiles, [canonical]: { identity, profile_id: profileId } } };
|
|
750
|
-
saveRelayConfig(this.deps.
|
|
829
|
+
await saveRelayConfig(this.deps.documents, config);
|
|
751
830
|
await this.configure(config, { profileId, identity });
|
|
752
831
|
return { ok: true, publisher_id: publisherId };
|
|
753
832
|
}
|
|
@@ -771,11 +850,10 @@ export class RelayService {
|
|
|
771
850
|
catch {
|
|
772
851
|
throw new RelayPairingError('Talaria Relay returned an invalid response', 502);
|
|
773
852
|
}
|
|
774
|
-
const
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
saveRelayConfig(this.deps.stateDir, config);
|
|
853
|
+
const keyDocument = createHash('sha256').update(keyId, 'utf8').digest('hex').slice(0, 16);
|
|
854
|
+
await updateDocument(this.deps.documents, 'relay-keys', keyDocument, () => ({ value: privateKey.export({ type: 'pkcs8', format: 'pem' }).toString(), result: undefined }));
|
|
855
|
+
const config = { url: relayUrl, publisher_id: finalPublisher, key_id: keyId, private_key_path: '', private_key_document: keyDocument, profiles: { [canonical]: { identity, profile_id: pairedProfile } } };
|
|
856
|
+
await saveRelayConfig(this.deps.documents, config);
|
|
779
857
|
await this.configure(config, { profileId: pairedProfile, identity });
|
|
780
858
|
return { ok: true, publisher_id: finalPublisher };
|
|
781
859
|
}
|