@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
|
@@ -7,14 +7,18 @@
|
|
|
7
7
|
* redelivered at turn teardown with a bounded retry budget).
|
|
8
8
|
*/
|
|
9
9
|
import { randomUUID } from 'node:crypto';
|
|
10
|
-
import {
|
|
11
|
-
import { join } from 'node:path';
|
|
10
|
+
import { readFileSync, realpathSync } from 'node:fs';
|
|
11
|
+
import { join, resolve } from 'node:path';
|
|
12
12
|
import { SessionNotFound } from './store.js';
|
|
13
13
|
import { str } from '../util.js';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { expandDotenv, parseDotenv } from '../cli/dotenv.js';
|
|
15
|
+
import { isDict, messageText } from './merge.js';
|
|
16
|
+
import { batchUpdate, recordBackgroundUpdate, completionAccepted } from './background-updates.js';
|
|
17
|
+
import { backgroundEventKind } from './background-events.js';
|
|
16
18
|
import { HeldWakeups, deliveredPerProcess, heldKey, mergeWakeups, poolRecovery, wakeupPaused } from './wakeup-pause.js';
|
|
17
19
|
export const COMPLETION_POLL_MS = 1000;
|
|
20
|
+
/** TAL-1395: each empty drain doubles the poll delay up to this cap; a routed event or `wake()` resets it to `pollMs`. */
|
|
21
|
+
const COMPLETION_IDLE_POLL_MS = 10_000;
|
|
18
22
|
const EMIT_COALESCE_WINDOW_S = 1;
|
|
19
23
|
const WAKEUP_RETRY_SECONDS = 30;
|
|
20
24
|
const WAKEUP_RETRY_MAX_ATTEMPTS = 5;
|
|
@@ -22,6 +26,13 @@ const WAKEUP_BATCH_MAX_CHARS = 24_000;
|
|
|
22
26
|
/** A session with held wakeups rechecks its pause at least this often (a credential edit has no deadline). */
|
|
23
27
|
const HELD_RECHECK_SECONDS = 300;
|
|
24
28
|
const DELIVERY_CONSUMER = 'webui';
|
|
29
|
+
const canonicalHome = (home) => { try {
|
|
30
|
+
return realpathSync(home);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return resolve(home);
|
|
34
|
+
} };
|
|
35
|
+
const completionKey = (home, event) => event.type === 'async_delegation' && event.delegation_id && !event.task_failure_notice ? JSON.stringify([canonicalHome(home), str(event.delegation_id)]) : '';
|
|
25
36
|
/** Python `format_wakeup_prompt` for plain completion events; async delegations use the sidecar formatter. */
|
|
26
37
|
export function formatWakeupPrompt(evt) {
|
|
27
38
|
const type = str(evt.type ?? 'completion');
|
|
@@ -38,7 +49,7 @@ export function formatWakeupPrompt(evt) {
|
|
|
38
49
|
body += `\n(${str(evt.suppressed)} earlier matches were suppressed by rate limit)`;
|
|
39
50
|
return body + ']';
|
|
40
51
|
}
|
|
41
|
-
if (
|
|
52
|
+
if (backgroundEventKind(evt) !== 'completion')
|
|
42
53
|
return null;
|
|
43
54
|
if (!(sid || cmd || 'exit_code' in evt || evt.output))
|
|
44
55
|
return null;
|
|
@@ -58,6 +69,10 @@ export class CompletionDrain {
|
|
|
58
69
|
deps;
|
|
59
70
|
timer = null;
|
|
60
71
|
stopped = false;
|
|
72
|
+
draining = false;
|
|
73
|
+
/** Consecutive drains that routed nothing; a `wake()` during a drain resets the count when it settles. */
|
|
74
|
+
idleDrains = 0;
|
|
75
|
+
woken = false;
|
|
61
76
|
seen = new Map();
|
|
62
77
|
pendingSessions = new Set();
|
|
63
78
|
deferred = new Map();
|
|
@@ -75,31 +90,68 @@ export class CompletionDrain {
|
|
|
75
90
|
unreleased = new Map();
|
|
76
91
|
/** TAL-576: wakeups held while their session is paused. */
|
|
77
92
|
heldWakeups;
|
|
93
|
+
/** Waiting requires an unadmitted result, not an admitted turn's outstanding ledger acknowledgement. */
|
|
94
|
+
async pendingDelegations(sid) {
|
|
95
|
+
try {
|
|
96
|
+
const session = (await this.deps.store.get(sid)), home = this.ownerHome(session);
|
|
97
|
+
return new Set((await this.heldWakeups.get(sid)).filter((entry) => {
|
|
98
|
+
const key = completionKey(home, entry.event ?? {});
|
|
99
|
+
return Boolean(key) && !completionAccepted(session, key);
|
|
100
|
+
}).map((entry) => str(entry.event?.delegation_id)).filter(Boolean));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return new Set();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
78
106
|
constructor(deps) {
|
|
79
107
|
this.deps = deps;
|
|
80
|
-
this.heldWakeups = new HeldWakeups(
|
|
108
|
+
this.heldWakeups = new HeldWakeups(deps.documents);
|
|
81
109
|
}
|
|
82
110
|
start() {
|
|
83
|
-
if (this.timer || this.stopped)
|
|
111
|
+
if (this.timer || this.draining || this.stopped)
|
|
112
|
+
return;
|
|
113
|
+
this.tick();
|
|
114
|
+
}
|
|
115
|
+
/** TAL-1395: a turn started or background work spawned; drain now and poll at the base interval again. */
|
|
116
|
+
wake() {
|
|
117
|
+
if (this.stopped)
|
|
118
|
+
return;
|
|
119
|
+
this.idleDrains = 0;
|
|
120
|
+
if (this.draining) {
|
|
121
|
+
this.woken = true;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (!this.timer)
|
|
125
|
+
return;
|
|
126
|
+
clearTimeout(this.timer);
|
|
127
|
+
this.schedule(0);
|
|
128
|
+
}
|
|
129
|
+
schedule(delay) {
|
|
130
|
+
this.timer = setTimeout(this.tick, delay);
|
|
131
|
+
this.timer.unref();
|
|
132
|
+
}
|
|
133
|
+
tick = () => {
|
|
134
|
+
if (this.stopped)
|
|
84
135
|
return;
|
|
85
|
-
|
|
136
|
+
this.timer = null;
|
|
137
|
+
this.draining = true;
|
|
138
|
+
this.woken = false;
|
|
139
|
+
// A lasting failure (an unrecoverable checkpoint fails every call in its home, TAL-533) is logged once, not every poll.
|
|
140
|
+
void this.drainOnce().then((routed) => { this.lastDrainError = null; return routed; }, (error) => {
|
|
141
|
+
const message = error.message;
|
|
142
|
+
if (message !== this.lastDrainError)
|
|
143
|
+
this.deps.log(`[webui] WARNING: bg_task_complete drain failed: ${message}`);
|
|
144
|
+
this.lastDrainError = message;
|
|
145
|
+
return 0;
|
|
146
|
+
}).catch(() => 0).then((routed) => {
|
|
147
|
+
this.draining = false;
|
|
86
148
|
if (this.stopped)
|
|
87
149
|
return;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
this.lastDrainError = message;
|
|
94
|
-
}).finally(() => {
|
|
95
|
-
if (this.stopped)
|
|
96
|
-
return;
|
|
97
|
-
this.timer = setTimeout(tick, this.deps.pollMs ?? COMPLETION_POLL_MS);
|
|
98
|
-
this.timer.unref();
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
|
-
tick();
|
|
102
|
-
}
|
|
150
|
+
this.idleDrains = routed > 0 || this.woken ? 0 : this.idleDrains + 1;
|
|
151
|
+
const base = this.deps.pollMs ?? COMPLETION_POLL_MS;
|
|
152
|
+
this.schedule(Math.min(base * 2 ** Math.max(0, this.idleDrains - 1), Math.max(base, COMPLETION_IDLE_POLL_MS)));
|
|
153
|
+
});
|
|
154
|
+
};
|
|
103
155
|
stop() {
|
|
104
156
|
this.stopped = true;
|
|
105
157
|
if (this.timer) {
|
|
@@ -133,7 +185,7 @@ export class CompletionDrain {
|
|
|
133
185
|
}
|
|
134
186
|
// TAL-576: whether or not every profile recovered, the sessions left holding wakeups resume once a sidecar answers.
|
|
135
187
|
if (!this.heldResumed)
|
|
136
|
-
this.resumeHeld();
|
|
188
|
+
(await this.resumeHeld());
|
|
137
189
|
// The drain is sidecar-wide; an active profile whose home escapes the profiles root (`profileHome` throws) scopes it
|
|
138
190
|
// to the base home instead of stalling every other profile's completions.
|
|
139
191
|
let scope;
|
|
@@ -166,19 +218,19 @@ export class CompletionDrain {
|
|
|
166
218
|
}
|
|
167
219
|
return routed;
|
|
168
220
|
}
|
|
169
|
-
resolveTarget(evt) {
|
|
221
|
+
async resolveTarget(evt) {
|
|
170
222
|
const sessionKey = str(evt.session_key).trim();
|
|
171
223
|
const origin = str(evt.origin_ui_session_id).trim();
|
|
172
|
-
const live = (sid) => { if (!sid)
|
|
224
|
+
const live = async (sid) => { if (!sid)
|
|
173
225
|
return ''; try {
|
|
174
|
-
this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false });
|
|
226
|
+
(await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }));
|
|
175
227
|
return sid;
|
|
176
228
|
}
|
|
177
229
|
catch {
|
|
178
230
|
return '';
|
|
179
231
|
} };
|
|
180
|
-
const resolved = live(sessionKey);
|
|
181
|
-
const owner = live(origin);
|
|
232
|
+
const resolved = (await live(sessionKey));
|
|
233
|
+
const owner = (await live(origin));
|
|
182
234
|
if (!owner)
|
|
183
235
|
return resolved;
|
|
184
236
|
if (resolved && resolved !== owner)
|
|
@@ -192,7 +244,8 @@ export class CompletionDrain {
|
|
|
192
244
|
return false;
|
|
193
245
|
}
|
|
194
246
|
async wakeupPrompt(evt) {
|
|
195
|
-
|
|
247
|
+
const kind = backgroundEventKind(evt);
|
|
248
|
+
if (kind === 'delegation' || kind === 'progress') {
|
|
196
249
|
const sidecar = this.deps.sidecar();
|
|
197
250
|
if (!sidecar)
|
|
198
251
|
return '';
|
|
@@ -205,30 +258,175 @@ export class CompletionDrain {
|
|
|
205
258
|
}
|
|
206
259
|
return (formatWakeupPrompt(evt) ?? '').trim();
|
|
207
260
|
}
|
|
261
|
+
/** The session's owning profile home; a session without a profile belongs to the root profile (`profilesMatch`). */
|
|
262
|
+
ownerHome(session) { return this.deps.profileHome(session.profile ?? 'default'); }
|
|
263
|
+
/** A profile's config; null when it cannot be read. */
|
|
264
|
+
async profileConfig(home) {
|
|
265
|
+
try {
|
|
266
|
+
return (await this.deps.readConfig?.(home)) ?? {};
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** The owning profile's `delegation.surface_child_process_notifications`; off, the Agent's default, when it cannot be read. */
|
|
273
|
+
async surfacesChildProcesses(sid) {
|
|
274
|
+
let config;
|
|
275
|
+
try {
|
|
276
|
+
config = await this.profileConfig(this.ownerHome((await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }))));
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
return isDict(config?.delegation) && config.delegation.surface_child_process_notifications === true;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* TAL-907 (Agent `_load_background_notifications_mode`): `HERMES_BACKGROUND_NOTIFICATIONS` from the profile's `.env`
|
|
285
|
+
* (which overrides the shell, as in the Agent) or the server environment, else `display.background_process_notifications`
|
|
286
|
+
* (YAML `false` is off). Only `off` changes Web delivery; null when the setting cannot be read.
|
|
287
|
+
*/
|
|
288
|
+
async notificationsOff(home) {
|
|
289
|
+
let mode;
|
|
290
|
+
try {
|
|
291
|
+
mode = expandDotenv(parseDotenv(readFileSync(join(home, '.env'), 'utf8')), this.deps.env ?? {}).HERMES_BACKGROUND_NOTIFICATIONS?.trim();
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
if (error.code !== 'ENOENT')
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
mode ||= this.deps.env?.HERMES_BACKGROUND_NOTIFICATIONS?.trim();
|
|
298
|
+
if (!mode) {
|
|
299
|
+
const config = await this.profileConfig(home);
|
|
300
|
+
if (!config)
|
|
301
|
+
return null;
|
|
302
|
+
mode = isDict(config.display) ? config.display.background_process_notifications : undefined;
|
|
303
|
+
}
|
|
304
|
+
return mode === false || str(mode).trim().toLowerCase() === 'off';
|
|
305
|
+
}
|
|
306
|
+
async isReadOnly(session) { return await this.deps.isReadOnly?.(session) ?? session.read_only; }
|
|
307
|
+
/** Hand durable results back without acknowledging delivery or mutating the canonical session. */
|
|
308
|
+
async relinquish(sid, session, entries, claims = []) {
|
|
309
|
+
try {
|
|
310
|
+
if (!(await this.settleClaims(this.ownerHome(session), 'process.defer_delivery', claims)))
|
|
311
|
+
throw new Error('delivery claim could not be returned');
|
|
312
|
+
const events = entries.flatMap((e) => e.event?.type === 'async_delegation' ? [e.event] : []);
|
|
313
|
+
if (events.length) {
|
|
314
|
+
const sidecar = this.deps.sidecar();
|
|
315
|
+
if (!sidecar)
|
|
316
|
+
throw new Error('sidecar unavailable');
|
|
317
|
+
await sidecar.call('process.requeue', { events });
|
|
318
|
+
}
|
|
319
|
+
this.deferred.delete(sid);
|
|
320
|
+
this.pendingSessions.delete(sid);
|
|
321
|
+
this.retryAttempts.delete(sid);
|
|
322
|
+
const timer = this.retryTimers.get(sid);
|
|
323
|
+
if (timer)
|
|
324
|
+
clearTimeout(timer);
|
|
325
|
+
this.retryTimers.delete(sid);
|
|
326
|
+
await this.release(sid);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
for (const entry of entries)
|
|
330
|
+
this.defer(sid, entry);
|
|
331
|
+
this.scheduleRetry(sid);
|
|
332
|
+
this.deps.log(`[webui] WARNING: completion hand-back failed for ${sid}: ${error.message}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
208
335
|
/** Python `_process_one`; returns false when the event has no owning WebUI session. */
|
|
209
336
|
async processOne(evt) {
|
|
210
337
|
const processId = str(evt.process_id).trim();
|
|
211
|
-
const sid = this.resolveTarget(evt);
|
|
338
|
+
const sid = (await this.resolveTarget(evt));
|
|
212
339
|
if (!sid)
|
|
213
340
|
return false;
|
|
341
|
+
let owner;
|
|
342
|
+
let home;
|
|
343
|
+
let homeError = '';
|
|
344
|
+
try {
|
|
345
|
+
owner = (await this.deps.store.get(sid));
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
home = this.ownerHome(owner);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
home = '';
|
|
355
|
+
homeError = error.message;
|
|
356
|
+
}
|
|
357
|
+
if (home && (await this.isReadOnly(owner)))
|
|
358
|
+
return false;
|
|
359
|
+
// Reconciliation needs positive profile proof; live events retain the existing admission deferral on home errors.
|
|
360
|
+
if (evt.reconciliation_profile_home && (!home || canonicalHome(str(evt.reconciliation_profile_home)) !== canonicalHome(home)))
|
|
361
|
+
return false;
|
|
362
|
+
if (evt.reconciliation_profile_home && completionAccepted(owner, completionKey(home, evt)))
|
|
363
|
+
return true;
|
|
214
364
|
if (evt.consumed === true)
|
|
215
365
|
return true;
|
|
366
|
+
// TAL-933 (Agent `should_surface_notification`): a subagent's own process notices stay out of the parent chat unless
|
|
367
|
+
// the session's profile opts in. Dropped, not consumed, as in the Agent: an exit nobody read still reaches the parent
|
|
368
|
+
// as the child's `unread_completions`.
|
|
369
|
+
if (evt.child_process === true && !(await this.surfacesChildProcesses(sid)))
|
|
370
|
+
return true;
|
|
216
371
|
const seen = this.seen.get(sid) ?? new Set();
|
|
217
372
|
this.seen.set(sid, seen);
|
|
218
373
|
// Only a per-process delivery can repeat: a watch event's key is unique, so remembering it would only grow `seen`.
|
|
219
374
|
if (processId && deliveredPerProcess(evt)) {
|
|
220
375
|
if (seen.has(processId))
|
|
221
376
|
return true;
|
|
222
|
-
seen.add(processId);
|
|
223
377
|
}
|
|
224
|
-
this.pendingSessions.add(sid);
|
|
225
378
|
const prompt = await this.wakeupPrompt(evt);
|
|
226
|
-
this.
|
|
227
|
-
|
|
228
|
-
|
|
379
|
+
if ((await this.isReadOnly(owner))) {
|
|
380
|
+
if (home)
|
|
381
|
+
return false;
|
|
382
|
+
this.defer(sid, { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt });
|
|
383
|
+
this.scheduleRetry(sid);
|
|
384
|
+
this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${homeError || 'ownership home unavailable'}; retrying`);
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
if (evt.reconciliation_profile_home && evt.delegation_id && prompt.includes(str(evt.delegation_id))) {
|
|
388
|
+
// Upgrade a proven pre-receipt Web turn; typed Agent bookkeeping alone never qualifies.
|
|
389
|
+
const previous = owner.messages.find((m) => m._source === 'process_wakeup' && m._turn_id && messageText(m.content) === prompt);
|
|
390
|
+
const turnId = str(previous?._turn_id) || (owner.pending_user_source === 'process_wakeup' && owner.pending_user_message === prompt ? str(owner.active_stream_id) : '');
|
|
391
|
+
if (turnId) {
|
|
392
|
+
const receipts = isDict(owner.extra.completion_acceptances) ? owner.extra.completion_acceptances : {};
|
|
393
|
+
owner.extra.completion_acceptances = { ...receipts, [completionKey(home, evt)]: turnId };
|
|
394
|
+
await this.deps.store.save(owner, { touchUpdatedAt: false });
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// The formatter awaits the sidecar; another drain may have retained this event meanwhile.
|
|
399
|
+
if (processId && deliveredPerProcess(evt) && seen.has(processId))
|
|
229
400
|
return true;
|
|
230
401
|
const entry = { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt };
|
|
231
|
-
if (
|
|
402
|
+
if (prompt && evt.type === 'async_delegation')
|
|
403
|
+
this.defer(sid, entry);
|
|
404
|
+
if (prompt && evt.type === 'async_delegation' && !evt.task_failure_notice) {
|
|
405
|
+
try {
|
|
406
|
+
// Busy, Stop, sealed and provider-paused entries survive either process restarting.
|
|
407
|
+
await this.heldWakeups.hold(sid, [entry]);
|
|
408
|
+
recordBackgroundUpdate(owner, `delegation:${str(evt.delegation_id)}`, batchUpdate([{ event: evt, prompt }]));
|
|
409
|
+
await this.deps.store.save(owner, { touchUpdatedAt: false });
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
this.scheduleRetry(sid);
|
|
413
|
+
this.deps.log(`[webui] WARNING: failed to persist delegation wakeup for session ${sid}; retained in memory for retry: ${error.message}`);
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (processId && deliveredPerProcess(evt))
|
|
418
|
+
seen.add(processId);
|
|
419
|
+
this.pendingSessions.add(sid);
|
|
420
|
+
await this.deps.background?.recordEvent(sid, evt, prompt);
|
|
421
|
+
if (backgroundEventKind(evt) !== 'progress')
|
|
422
|
+
this.emitCoalesced(sid, this.buildPayload(evt, sid, prompt), owner.profile ?? 'default');
|
|
423
|
+
if (!prompt)
|
|
424
|
+
return true;
|
|
425
|
+
if (evt.type === 'async_delegation') {
|
|
426
|
+
if (!this.hasActiveTurn(sid))
|
|
427
|
+
await this.drainDeferred(sid);
|
|
428
|
+
}
|
|
429
|
+
else if (this.hasActiveTurn(sid))
|
|
232
430
|
this.defer(sid, entry);
|
|
233
431
|
else
|
|
234
432
|
await this.startWakeup(sid, [entry]);
|
|
@@ -241,7 +439,7 @@ export class CompletionDrain {
|
|
|
241
439
|
payload.summary = first.length <= 200 ? first : `${first.slice(0, 200)}\n…(truncated)`;
|
|
242
440
|
return payload;
|
|
243
441
|
}
|
|
244
|
-
emitNow(sid, payload) {
|
|
442
|
+
emitNow(sid, payload, profile) {
|
|
245
443
|
let emitted = 0;
|
|
246
444
|
for (const [streamId, channel] of this.deps.registry.streams) {
|
|
247
445
|
if (this.deps.registry.activeRuns.get(streamId)?.session_id !== sid)
|
|
@@ -250,12 +448,12 @@ export class CompletionDrain {
|
|
|
250
448
|
channel.put(['process_complete', { ...payload }, null]);
|
|
251
449
|
emitted += 2;
|
|
252
450
|
}
|
|
253
|
-
emitted += this.deps.channels.emit(sid, 'bg_task_complete', { ...payload });
|
|
254
|
-
emitted += this.deps.channels.emit(sid, 'process_complete', { ...payload });
|
|
451
|
+
emitted += this.deps.channels.emit(sid, 'bg_task_complete', { ...payload }, profile);
|
|
452
|
+
emitted += this.deps.channels.emit(sid, 'process_complete', { ...payload }, profile);
|
|
255
453
|
return emitted;
|
|
256
454
|
}
|
|
257
455
|
/** Python `_emit_bg_task_complete_events_coalesced`: first emit immediately, bursts flush the latest payload after 1 s of quiet. */
|
|
258
|
-
emitCoalesced(sid, payload) {
|
|
456
|
+
emitCoalesced(sid, payload, profile) {
|
|
259
457
|
const now = this.deps.now();
|
|
260
458
|
const last = this.lastEmitAt.get(sid);
|
|
261
459
|
const pending = this.pendingEmit.get(sid);
|
|
@@ -265,7 +463,7 @@ export class CompletionDrain {
|
|
|
265
463
|
this.pendingEmit.delete(sid);
|
|
266
464
|
}
|
|
267
465
|
this.lastEmitAt.set(sid, now);
|
|
268
|
-
this.emitNow(sid, payload);
|
|
466
|
+
this.emitNow(sid, payload, profile);
|
|
269
467
|
return;
|
|
270
468
|
}
|
|
271
469
|
if (pending)
|
|
@@ -276,10 +474,10 @@ export class CompletionDrain {
|
|
|
276
474
|
if (!entry)
|
|
277
475
|
return;
|
|
278
476
|
this.lastEmitAt.set(sid, this.deps.now());
|
|
279
|
-
this.emitNow(sid, entry.payload);
|
|
477
|
+
this.emitNow(sid, entry.payload, entry.profile);
|
|
280
478
|
}, EMIT_COALESCE_WINDOW_S * 1000);
|
|
281
479
|
timer.unref();
|
|
282
|
-
this.pendingEmit.set(sid, { payload, timer });
|
|
480
|
+
this.pendingEmit.set(sid, { payload, profile, timer });
|
|
283
481
|
}
|
|
284
482
|
recordDeferred(sid, processId, prompt, event) {
|
|
285
483
|
this.defer(sid, { process_id: deliveryKey(event ?? {}, processId), wakeup_prompt: prompt, ...(event ? { event } : {}) });
|
|
@@ -313,10 +511,12 @@ export class CompletionDrain {
|
|
|
313
511
|
* another consumer delivered (or holds) it, so it leaves the batch; a sidecar failure returns null so the caller keeps
|
|
314
512
|
* every entry pending. Claims are taken at delivery, never while deferred, so a long turn cannot outlive the lease.
|
|
315
513
|
*/
|
|
316
|
-
async claimBatch(home, batched) {
|
|
514
|
+
async claimBatch(home, batched, session) {
|
|
317
515
|
const deliver = [];
|
|
318
516
|
const held = [];
|
|
319
517
|
for (const entry of batched) {
|
|
518
|
+
if ((await this.isReadOnly(session)))
|
|
519
|
+
break;
|
|
320
520
|
if (entry.event?.type !== 'async_delegation') {
|
|
321
521
|
deliver.push(entry);
|
|
322
522
|
continue;
|
|
@@ -326,7 +526,10 @@ export class CompletionDrain {
|
|
|
326
526
|
try {
|
|
327
527
|
if (!sidecar)
|
|
328
528
|
throw new Error('sidecar unavailable');
|
|
329
|
-
|
|
529
|
+
const claim = await sidecar.call('process.claim_delivery', { profile_home: home, event: entry.event, consumer: DELIVERY_CONSUMER });
|
|
530
|
+
if (claim.retryable)
|
|
531
|
+
throw new Error('another consumer holds the pending result');
|
|
532
|
+
claimId = claim.claim_id;
|
|
330
533
|
}
|
|
331
534
|
catch (error) {
|
|
332
535
|
await this.settleClaims(home, 'process.release_delivery', held);
|
|
@@ -349,15 +552,18 @@ export class CompletionDrain {
|
|
|
349
552
|
async settleClaims(home, method, held) {
|
|
350
553
|
const sidecar = this.deps.sidecar();
|
|
351
554
|
if (!sidecar)
|
|
352
|
-
return;
|
|
555
|
+
return held.length === 0;
|
|
556
|
+
let ok = true;
|
|
353
557
|
for (const claim of held) {
|
|
354
558
|
try {
|
|
355
559
|
await sidecar.call(method, { profile_home: home, event: claim.event, claim_id: claim.claim_id });
|
|
356
560
|
}
|
|
357
561
|
catch (error) {
|
|
562
|
+
ok = false;
|
|
358
563
|
this.deps.log(`[webui] WARNING: ${method} failed for ${str(claim.event.delegation_id)}: ${error.message}`);
|
|
359
564
|
}
|
|
360
565
|
}
|
|
566
|
+
return ok;
|
|
361
567
|
}
|
|
362
568
|
scheduleRetry(sid) {
|
|
363
569
|
const attempts = (this.retryAttempts.get(sid) ?? 0) + 1;
|
|
@@ -391,10 +597,10 @@ export class CompletionDrain {
|
|
|
391
597
|
}
|
|
392
598
|
}
|
|
393
599
|
/** A restarted server resumes every session it left holding wakeups (`startWakeup` drops a deleted session's). */
|
|
394
|
-
resumeHeld() {
|
|
600
|
+
async resumeHeld() {
|
|
395
601
|
let sids;
|
|
396
602
|
try {
|
|
397
|
-
sids = this.heldWakeups.sessions();
|
|
603
|
+
sids = (await this.heldWakeups.sessions());
|
|
398
604
|
}
|
|
399
605
|
catch (error) {
|
|
400
606
|
this.deps.log(`[webui] WARNING: held wakeups unreadable; retrying: ${error.message}`);
|
|
@@ -404,12 +610,12 @@ export class CompletionDrain {
|
|
|
404
610
|
for (const sid of sids)
|
|
405
611
|
void this.drainDeferred(sid);
|
|
406
612
|
}
|
|
407
|
-
held(sid) {
|
|
613
|
+
async held(sid) {
|
|
408
614
|
if (this.unreleased.has(sid))
|
|
409
|
-
this.release(sid, []);
|
|
615
|
+
(await this.release(sid, []));
|
|
410
616
|
const done = new Set((this.unreleased.get(sid) ?? []).map(heldKey));
|
|
411
617
|
try {
|
|
412
|
-
return this.heldWakeups.get(sid).filter((e) => !done.has(heldKey(e)));
|
|
618
|
+
return (await this.heldWakeups.get(sid)).filter((e) => !done.has(heldKey(e)));
|
|
413
619
|
}
|
|
414
620
|
catch (error) {
|
|
415
621
|
// An unreadable store is unknown, not empty: recheck later rather than leave the session dormant.
|
|
@@ -419,15 +625,15 @@ export class CompletionDrain {
|
|
|
419
625
|
}
|
|
420
626
|
}
|
|
421
627
|
/** A session whose file is gone was deleted; any other load failure keeps its wakeups. */
|
|
422
|
-
deleted(sid, error) {
|
|
423
|
-
return error instanceof SessionNotFound && !
|
|
628
|
+
async deleted(sid, error) {
|
|
629
|
+
return error instanceof SessionNotFound && !await this.deps.store.exists(sid);
|
|
424
630
|
}
|
|
425
631
|
/** Admitted or settled wakeups (every one, with none given) leave the held file. */
|
|
426
|
-
release(sid, entries) {
|
|
632
|
+
async release(sid, entries) {
|
|
427
633
|
// Earlier releases that could not be written go with this one.
|
|
428
634
|
const batch = entries ? mergeWakeups([...(this.unreleased.get(sid) ?? [])], entries) : undefined;
|
|
429
635
|
try {
|
|
430
|
-
this.heldWakeups.release(sid, batch);
|
|
636
|
+
await this.heldWakeups.release(sid, batch);
|
|
431
637
|
this.unreleased.delete(sid);
|
|
432
638
|
}
|
|
433
639
|
catch (error) {
|
|
@@ -436,9 +642,9 @@ export class CompletionDrain {
|
|
|
436
642
|
this.deps.log(`[webui] WARNING: failed to release held wakeups for session ${sid}; they are not delivered again: ${error.message}`);
|
|
437
643
|
}
|
|
438
644
|
}
|
|
439
|
-
saveSession(sid, session) {
|
|
645
|
+
async saveSession(sid, session) {
|
|
440
646
|
try {
|
|
441
|
-
this.deps.store.save(session, { touchUpdatedAt: false });
|
|
647
|
+
(await this.deps.store.save(session, { touchUpdatedAt: false }));
|
|
442
648
|
}
|
|
443
649
|
catch (error) {
|
|
444
650
|
this.deps.log(`[webui] WARNING: failed to save wakeup pause for session ${sid}: ${error.message}`);
|
|
@@ -450,10 +656,14 @@ export class CompletionDrain {
|
|
|
450
656
|
* Returns whether the wakeup is handled here (held, or dropped with its deleted session).
|
|
451
657
|
*/
|
|
452
658
|
async holdWhilePaused(sid, session, home, batched) {
|
|
659
|
+
if ((await this.isReadOnly(session))) {
|
|
660
|
+
await this.relinquish(sid, session, batched);
|
|
661
|
+
return true;
|
|
662
|
+
}
|
|
453
663
|
const pause = session.process_wakeup_pause;
|
|
454
664
|
if (!wakeupPaused(session, home, this.deps.configPath?.(home))) {
|
|
455
665
|
if (pause !== session.process_wakeup_pause)
|
|
456
|
-
this.saveSession(sid, session);
|
|
666
|
+
(await this.saveSession(sid, session));
|
|
457
667
|
return false;
|
|
458
668
|
}
|
|
459
669
|
const recovery = await this.poolRecovery(home, session);
|
|
@@ -461,26 +671,30 @@ export class CompletionDrain {
|
|
|
461
671
|
// A deleted session owns no turn; a transient load failure holds the wakeups for the next recheck.
|
|
462
672
|
let current = null;
|
|
463
673
|
try {
|
|
464
|
-
current = this.deps.store.get(sid);
|
|
674
|
+
current = (await this.deps.store.get(sid));
|
|
465
675
|
}
|
|
466
676
|
catch (error) {
|
|
467
|
-
if (this.deleted(sid, error)) {
|
|
468
|
-
this.release(sid);
|
|
677
|
+
if ((await this.deleted(sid, error))) {
|
|
678
|
+
(await this.release(sid));
|
|
469
679
|
return true;
|
|
470
680
|
}
|
|
471
681
|
}
|
|
472
682
|
if (current) {
|
|
683
|
+
if ((await this.isReadOnly(current))) {
|
|
684
|
+
await this.relinquish(sid, current, batched);
|
|
685
|
+
return true;
|
|
686
|
+
}
|
|
473
687
|
const before = current.process_wakeup_pause;
|
|
474
688
|
if (recovery === true)
|
|
475
689
|
current.process_wakeup_pause = null;
|
|
476
690
|
if (recovery === true || !wakeupPaused(current, home, this.deps.configPath?.(home))) {
|
|
477
691
|
if (before !== current.process_wakeup_pause)
|
|
478
|
-
this.saveSession(sid, current);
|
|
692
|
+
(await this.saveSession(sid, current));
|
|
479
693
|
return false;
|
|
480
694
|
}
|
|
481
695
|
}
|
|
482
696
|
try {
|
|
483
|
-
this.heldWakeups.hold(sid, batched);
|
|
697
|
+
(await this.heldWakeups.hold(sid, batched));
|
|
484
698
|
}
|
|
485
699
|
catch (error) {
|
|
486
700
|
for (const e of batched)
|
|
@@ -493,17 +707,18 @@ export class CompletionDrain {
|
|
|
493
707
|
return true;
|
|
494
708
|
}
|
|
495
709
|
/** Python `_start_server_side_wakeup_turn`: one batched turn; 409 re-defers, other failures re-defer with a timed retry. */
|
|
496
|
-
async startWakeup(sid,
|
|
710
|
+
async startWakeup(sid, wakeups) {
|
|
711
|
+
let batched = wakeups;
|
|
497
712
|
const redefer = (entries) => { for (const e of entries)
|
|
498
713
|
this.defer(sid, e); };
|
|
499
714
|
let session;
|
|
500
715
|
try {
|
|
501
|
-
session = this.deps.store.get(sid);
|
|
716
|
+
session = (await this.deps.store.get(sid));
|
|
502
717
|
}
|
|
503
718
|
catch (error) {
|
|
504
719
|
// A deleted session owns no turn: its wakeups, held ones included, go with it.
|
|
505
|
-
if (this.deleted(sid, error)) {
|
|
506
|
-
this.release(sid);
|
|
720
|
+
if ((await this.deleted(sid, error))) {
|
|
721
|
+
(await this.release(sid));
|
|
507
722
|
this.deps.log(`[webui] server-side wakeup dropped for deleted session ${sid}`);
|
|
508
723
|
return false;
|
|
509
724
|
}
|
|
@@ -520,25 +735,72 @@ export class CompletionDrain {
|
|
|
520
735
|
// TAL-534: the delegation's ledger row lives in the session's own profile, whichever profile is active now.
|
|
521
736
|
let home;
|
|
522
737
|
try {
|
|
523
|
-
home = this.
|
|
738
|
+
home = this.ownerHome(session);
|
|
524
739
|
}
|
|
525
740
|
catch (error) {
|
|
526
741
|
redefer(batched);
|
|
527
742
|
this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${error.message}`);
|
|
528
743
|
return false;
|
|
529
744
|
}
|
|
745
|
+
if ((await this.isReadOnly(session))) {
|
|
746
|
+
await this.relinquish(sid, session, batched);
|
|
747
|
+
return false;
|
|
748
|
+
}
|
|
749
|
+
const accepted = batched.filter((e) => completionAccepted(session, completionKey(home, e.event ?? {})));
|
|
750
|
+
if (accepted.length) {
|
|
751
|
+
// A crash may have saved admission before acknowledging the Agent. Finish that handshake without a new turn.
|
|
752
|
+
const claims = await this.claimBatch(home, accepted, session);
|
|
753
|
+
if (claims && (await this.isReadOnly(session))) {
|
|
754
|
+
await this.relinquish(sid, session, batched, claims.held);
|
|
755
|
+
return false;
|
|
756
|
+
}
|
|
757
|
+
if (!claims || !(await this.settleClaims(home, 'process.complete_delivery', claims.held))) {
|
|
758
|
+
redefer(batched);
|
|
759
|
+
this.scheduleRetry(sid);
|
|
760
|
+
return false;
|
|
761
|
+
}
|
|
762
|
+
await this.release(sid, accepted);
|
|
763
|
+
batched = batched.filter((e) => !accepted.includes(e));
|
|
764
|
+
}
|
|
765
|
+
if (!batched.length)
|
|
766
|
+
return false;
|
|
767
|
+
// TAL-907: `off` mutes process-driven wakeups at delivery, so a deferred or held wakeup follows the current setting; the
|
|
768
|
+
// drained event's record and status row are its whole delivery. A subagent result is not a process notification and
|
|
769
|
+
// still lands, as in the Agent. A setting that cannot be read retains the wakeups rather than start a turn.
|
|
770
|
+
const muted = batched.filter((e) => e.event?.type !== 'async_delegation');
|
|
771
|
+
if (muted.length) {
|
|
772
|
+
const off = await this.notificationsOff(home);
|
|
773
|
+
if (off === null) {
|
|
774
|
+
redefer(batched);
|
|
775
|
+
this.scheduleRetry(sid);
|
|
776
|
+
this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: background_process_notifications is unreadable; retrying`);
|
|
777
|
+
return false;
|
|
778
|
+
}
|
|
779
|
+
if (off) {
|
|
780
|
+
await this.release(sid, muted);
|
|
781
|
+
batched = batched.filter((e) => !muted.includes(e));
|
|
782
|
+
if (!batched.length) {
|
|
783
|
+
this.retryAttempts.delete(sid);
|
|
784
|
+
return false;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
530
788
|
if (await this.holdWhilePaused(sid, session, home, batched))
|
|
531
789
|
return false;
|
|
532
|
-
const claimed = await this.claimBatch(home, batched);
|
|
790
|
+
const claimed = await this.claimBatch(home, batched, session);
|
|
533
791
|
if (!claimed) {
|
|
534
792
|
redefer(batched);
|
|
535
793
|
this.scheduleRetry(sid);
|
|
536
794
|
return false;
|
|
537
795
|
}
|
|
538
796
|
const { deliver, held } = claimed;
|
|
797
|
+
if ((await this.isReadOnly(session))) {
|
|
798
|
+
await this.relinquish(sid, session, batched, held);
|
|
799
|
+
return false;
|
|
800
|
+
}
|
|
539
801
|
// Entries another consumer already delivered are done here too.
|
|
540
802
|
if (!deliver.length) {
|
|
541
|
-
this.release(sid, batched);
|
|
803
|
+
(await this.release(sid, batched));
|
|
542
804
|
await this.markConsumed(batched);
|
|
543
805
|
return true;
|
|
544
806
|
}
|
|
@@ -547,7 +809,7 @@ export class CompletionDrain {
|
|
|
547
809
|
const prompt = deliver.length === 1 ? deliver[0].wakeup_prompt : deliver.map((e) => e.wakeup_prompt).join('\n\n');
|
|
548
810
|
let resp;
|
|
549
811
|
try {
|
|
550
|
-
resp = await this.deps.startTurn(session, prompt);
|
|
812
|
+
resp = await this.deps.startTurn(session, prompt, deliver.map((e) => completionKey(home, e.event ?? {})).filter(Boolean), batchUpdate(deliver.map((e) => ({ event: e.event ?? {}, prompt: e.wakeup_prompt }))));
|
|
551
813
|
}
|
|
552
814
|
catch (error) {
|
|
553
815
|
await giveBack();
|
|
@@ -555,6 +817,10 @@ export class CompletionDrain {
|
|
|
555
817
|
this.deps.log(`[webui] WARNING: server-side wakeup turn raised for session ${sid}: ${error.message}`);
|
|
556
818
|
return false;
|
|
557
819
|
}
|
|
820
|
+
if ((await this.isReadOnly(session))) {
|
|
821
|
+
await this.relinquish(sid, session, batched, held);
|
|
822
|
+
return false;
|
|
823
|
+
}
|
|
558
824
|
const status = resp._status ?? (resp.stream_id ? 200 : 500);
|
|
559
825
|
// A busy session redelivers at its turn teardown; a stale runtime admits no turn, so it is retried on a timer (TAL-577).
|
|
560
826
|
if (status === 409) {
|
|
@@ -570,9 +836,14 @@ export class CompletionDrain {
|
|
|
570
836
|
return false;
|
|
571
837
|
}
|
|
572
838
|
this.retryAttempts.delete(sid);
|
|
573
|
-
this.release(sid, batched);
|
|
574
839
|
recordBackgroundUpdate(session, str(resp.stream_id), batchUpdate(deliver.map((e) => ({ event: e.event ?? {}, prompt: e.wakeup_prompt }))));
|
|
575
|
-
await this.
|
|
840
|
+
await this.saveSession(sid, session);
|
|
841
|
+
if (await this.settleClaims(home, 'process.complete_delivery', held))
|
|
842
|
+
(await this.release(sid, batched));
|
|
843
|
+
else {
|
|
844
|
+
redefer(deliver);
|
|
845
|
+
this.scheduleRetry(sid);
|
|
846
|
+
}
|
|
576
847
|
await this.markConsumed(batched);
|
|
577
848
|
this.deps.log(`[webui] server-side wakeup turn started for session ${sid} (stream_id=${str(resp.stream_id)})`);
|
|
578
849
|
return true;
|
|
@@ -601,7 +872,7 @@ export class CompletionDrain {
|
|
|
601
872
|
* TAL-576: one drain per session at a time, so two never copy the same held wakeups before either admits them.
|
|
602
873
|
*/
|
|
603
874
|
drainDeferred(sid) {
|
|
604
|
-
const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(() => this.drainDeferredNow(sid));
|
|
875
|
+
const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(async () => (await this.drainDeferredNow(sid)));
|
|
605
876
|
this.drains.set(sid, run);
|
|
606
877
|
void run.finally(() => { if (this.drains.get(sid) === run)
|
|
607
878
|
this.drains.delete(sid); }).catch(() => undefined);
|
|
@@ -610,7 +881,7 @@ export class CompletionDrain {
|
|
|
610
881
|
async drainDeferredNow(sid) {
|
|
611
882
|
if (!sid || this.hasActiveTurn(sid))
|
|
612
883
|
return 0;
|
|
613
|
-
const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], this.held(sid));
|
|
884
|
+
const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], (await this.held(sid)));
|
|
614
885
|
if (!entries.length)
|
|
615
886
|
return 0;
|
|
616
887
|
this.deferred.delete(sid);
|
|
@@ -618,7 +889,7 @@ export class CompletionDrain {
|
|
|
618
889
|
const prompted = entries.filter((e) => e.wakeup_prompt.trim());
|
|
619
890
|
const held = await this.alreadyConsumed(prompted);
|
|
620
891
|
if (held.size) {
|
|
621
|
-
this.release(sid, [...held]);
|
|
892
|
+
await this.release(sid, [...held]);
|
|
622
893
|
const ids = [...held].map((e) => e.process_id);
|
|
623
894
|
await this.markConsumed([...held]);
|
|
624
895
|
this.deps.log(`[webui] dropped ${String(held.size)} deferred wakeup(s) already consumed by the agent's own turn for session ${sid}: ${ids.join(', ')}`);
|