@maudecode/talaria-web 1.18.0 → 1.19.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 +32 -32
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +102 -22
- package/dist/api/automation-router.js +15 -13
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1205 -34
- package/dist/api/chat-router.js +158 -78
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +2 -2
- package/dist/api/git-router.js +29 -29
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +3 -3
- package/dist/api/raw-routes.js +63 -61
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +6 -6
- 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 +1928 -124
- package/dist/api/sessions-router.js +177 -173
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +427 -9
- package/dist/api/settings-router.js +48 -32
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +2 -2
- package/dist/api/sse-routes.js +63 -63
- 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 +663 -91
- package/dist/api/tools-router.js +309 -52
- 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 +66 -47
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +10 -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 +2 -1
- 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 +85 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/supervise.d.ts +2 -0
- package/dist/cli/supervise.js +67 -4
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +34 -11
- package/dist/config/agent-config.js +113 -58
- 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 +1 -0
- package/dist/fs/atomic.js +4 -1
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +1 -0
- package/dist/fs/stat.js +11 -0
- package/dist/fs/stat.js.map +1 -0
- package/dist/http/context.d.ts +14 -9
- package/dist/http/context.js +29 -20
- 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 +10 -4
- package/dist/profiles/profiles.js +77 -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 +78 -12
- package/dist/providers/catalog.js +445 -141
- 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 +18 -9
- package/dist/redact.js.map +1 -1
- package/dist/release.d.ts +7 -0
- package/dist/release.js +14 -0
- package/dist/release.js.map +1 -1
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.js +233 -90
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -1
- package/dist/sessions/anchor.d.ts +9 -3
- package/dist/sessions/anchor.js +28 -36
- 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 +26 -20
- package/dist/sessions/background-tasks.js +88 -86
- 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 +15 -5
- package/dist/sessions/cli-sessions.js +62 -43
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +30 -2
- package/dist/sessions/completions.js +294 -53
- 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/gateway-sessions.d.ts +46 -0
- package/dist/sessions/gateway-sessions.js +378 -0
- package/dist/sessions/gateway-sessions.js.map +1 -0
- 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 +27 -18
- package/dist/sessions/list.js +133 -131
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +68 -10
- package/dist/sessions/merge.js +259 -51
- 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 +82 -0
- package/dist/sessions/prefix-index.js +232 -0
- package/dist/sessions/prefix-index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +4 -7
- package/dist/sessions/recovery.js +97 -281
- 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 +162 -59
- package/dist/sessions/service.js +1133 -521
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +18 -2
- package/dist/sessions/session.js +29 -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 +3 -1
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +53 -8
- package/dist/sessions/state-db.js +576 -50
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +162 -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 +23 -0
- package/dist/sessions/storage/json-documents.js +233 -0
- package/dist/sessions/storage/json-documents.js.map +1 -0
- package/dist/sessions/storage/json-files.d.ts +12 -0
- package/dist/sessions/storage/json-files.js +124 -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 +114 -0
- package/dist/sessions/storage/json-journal.js +686 -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 +68 -0
- package/dist/sessions/storage/json.js +258 -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 +63 -73
- package/dist/sessions/store.js +305 -611
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +4 -0
- package/dist/sessions/streams.js +9 -1
- 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 +5 -4
- package/dist/sessions/tool-display.js +22 -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 +7 -4
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +87 -17
- package/dist/sessions/turn.js +795 -347
- 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 +17 -3
- package/dist/sidecar/client.js +78 -8
- 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.js +19 -2
- package/dist/sidecar/fake.js.map +1 -1
- 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/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 +38 -1
- package/dist/tools/crons.js +82 -15
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +5 -5
- package/dist/tools/dashboard-plugins.js +14 -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 +62 -0
- package/dist/tools/gateway-restart.js +142 -0
- package/dist/tools/gateway-restart.js.map +1 -0
- package/dist/tools/health.d.ts +15 -3
- package/dist/tools/health.js +97 -34
- 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/kanban.d.ts +4 -2
- package/dist/tools/kanban.js +28 -19
- package/dist/tools/kanban.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-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/skills.d.ts +9 -4
- package/dist/tools/skills.js +44 -13
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +34 -15
- package/dist/tools/update-notifications.js +141 -57
- 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 +93 -33
- package/dist/tools/updates.js +1051 -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 +31 -20
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/rollback.d.ts +2 -2
- package/dist/workspace/rollback.js +5 -5
- 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 +5 -3
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +26 -0
- package/sidecar/scripts/record-fixtures.py +12 -3
- package/sidecar/scripts/replay_sidecar.py +8 -0
- package/sidecar/scripts/suite_runner.py +302 -0
- package/sidecar/scripts/test.sh +12 -4
- package/sidecar/talaria_sidecar/__init__.py +6 -1
- package/sidecar/talaria_sidecar/__main__.py +4 -2
- package/sidecar/talaria_sidecar/agent_mutation.py +975 -0
- package/sidecar/talaria_sidecar/agent_services.py +1053 -0
- package/sidecar/talaria_sidecar/dependency_sync.py +85 -0
- package/sidecar/talaria_sidecar/home.py +43 -1
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +139 -31
- package/sidecar/talaria_sidecar/methods/chat.py +847 -134
- package/sidecar/talaria_sidecar/methods/commands.py +213 -4
- package/sidecar/talaria_sidecar/methods/config.py +123 -4
- package/sidecar/talaria_sidecar/methods/connectors.py +343 -0
- package/sidecar/talaria_sidecar/methods/cron.py +366 -34
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +194 -54
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +234 -0
- package/sidecar/talaria_sidecar/methods/goals.py +81 -41
- package/sidecar/talaria_sidecar/methods/kanban.py +80 -27
- package/sidecar/talaria_sidecar/methods/memory.py +84 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +5 -2
- package/sidecar/talaria_sidecar/methods/process.py +160 -11
- package/sidecar/talaria_sidecar/methods/profiles.py +44 -6
- package/sidecar/talaria_sidecar/methods/providers.py +196 -26
- package/sidecar/talaria_sidecar/methods/runtime.py +69 -1
- package/sidecar/talaria_sidecar/methods/skills.py +67 -4
- package/sidecar/talaria_sidecar/methods/state_db.py +277 -70
- 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 +49 -0
- package/sidecar/talaria_sidecar/methods/usage.py +113 -14
- package/sidecar/talaria_sidecar/methods/worktree.py +26 -19
- package/sidecar/talaria_sidecar/methods/write_approval.py +181 -0
- package/sidecar/talaria_sidecar/rpc.py +45 -4
- package/sidecar/talaria_sidecar/runtime.py +81 -12
- package/sidecar/talaria_sidecar/speed.py +35 -0
- package/static/dist/FILES.txt +126 -127
- package/static/dist/assets/AppShell-cey33v9s.js +8 -0
- package/static/dist/assets/ChatPage-i8wnugr7.js +18 -0
- package/static/dist/assets/ConnectTargets-hg19553x.js +1 -0
- package/static/dist/assets/ExtensionRoute-cly4apm5.js +1 -0
- package/static/dist/assets/Field-j8uqoigz.js +9 -0
- package/static/dist/assets/HubRoute-e4bgz41j.js +2 -0
- package/static/dist/assets/Markdown-lahuichm.js +598 -0
- package/static/dist/assets/RightPanel-lbo4i0fn.js +1 -0
- package/static/dist/assets/Select-gqatm2e0.js +1 -0
- package/static/dist/assets/SessionListPanel-mfqayfjh.js +1 -0
- package/static/dist/assets/SettingsLayout-b8980u7k.js +1 -0
- package/static/dist/assets/States-e7dkgtxf.js +1 -0
- package/static/dist/assets/Toaster-bfqqy786.js +1 -0
- package/static/dist/assets/_app-n1n6pfx1.js +1 -0
- package/static/dist/assets/{_app.ext._extensionId-gfbzpoou.js → _app.ext._extensionId-buxjxav3.js} +1 -1
- package/static/dist/assets/_app.index-jt8zwiu2.js +1 -0
- package/static/dist/assets/_app.insights-cv76ml71.js +1 -0
- package/static/dist/assets/_app.kanban-h6ts53j7.js +1 -0
- package/static/dist/assets/_app.logs-dm873z90.js +1 -0
- package/static/dist/assets/_app.memory-glk5y6m8.js +1 -0
- package/static/dist/assets/_app.profiles-ka6zpstq.js +1 -0
- package/static/dist/assets/{_app.session._sessionId-fn1bhde6.js → _app.session._sessionId-g2vzghvc.js} +1 -1
- package/static/dist/assets/_app.settings-hgjdhzcd.js +1 -0
- package/static/dist/assets/_app.settings._section-jf2kmhae.js +3 -0
- package/static/dist/assets/_app.skills-cii852yq.js +1 -0
- package/static/dist/assets/_app.tasks-fp9q7atm.js +1 -0
- package/static/dist/assets/_app.todos-dw94qzue.js +1 -0
- package/static/dist/assets/_app.workspaces-inyygzze.js +1 -0
- package/static/dist/assets/{abnfDiagram-VCTEODGH-c8kdixke.js → abnfDiagram-VCTEODGH-gjayq3ra.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-cku06x1p.js → architectureDiagram-5GKGNRK7-nwb3xovn.js} +1 -1
- package/static/dist/assets/archive-b1j004vn.js +1 -0
- package/static/dist/assets/back-g74gkozu.js +1 -0
- package/static/dist/assets/{blockDiagram-I7D4REHJ-jzthp1wa.js → blockDiagram-I7D4REHJ-joedghi3.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-mwr67mt8.js → c4Diagram-7LVT6UL2-hyrjrohe.js} +1 -1
- package/static/dist/assets/channel-es95o4y8.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-gpq1y228.js → chunk-4HAMMTFA-koouqbut.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-ktje58c4.js → chunk-75Z2AOVW-bl4bhdnt.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-ofajdixh.js → chunk-DU6HZSFF-gpedttsp.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-cmev85ti.js → chunk-F27PBJKO-d8xxi0zi.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-htjgt22y.js → chunk-GMAD6QVW-jro0hl73.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-qndvoxl7.js → chunk-GVQU2GXP-djn6gbyu.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-e5bkd5q6.js → chunk-IMKFNOWR-vw4p5p7o.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-mj1155r6.js → chunk-L3NEJ4N5-n1hj77q8.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-e7gkikcw.js → chunk-OSK3NFVY-oy0gwn2n.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-f7t54xfm.js → chunk-P2QGCYS3-onf1hz6c.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-i927v9oa.js → chunk-POPQ4Y6H-m8sqn7cs.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-m84lmnyt.js → chunk-PWAF6VOD-ek4smc8x.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-mi0tlcu9.js → chunk-SHT3W25Y-g9gfvefo.js} +3 -3
- package/static/dist/assets/{chunk-SVP7TREG-dnau702j.js → chunk-SVP7TREG-f9nfv2cu.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-edem1gkg.js → chunk-TICWLB2K-bnk3m1mq.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-kmihoqxh.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-kmihoqxh.js +1 -0
- package/static/dist/assets/copied-bli9tbcx.js +1 -0
- package/static/dist/assets/{copy-magtofyp.js → copy-jamtd1pf.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-siqlulkl.js → cynefin-OW5HDTMX-f8xfdd3f.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-i648tah9.js → cynefinDiagram-5FMLGOSQ-n9lb99h9.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-mwn6uc17.js → dagre-GXQ25YYZ-dgailddi.js} +4 -4
- package/static/dist/assets/{diagram-S7CK7UJ4-l8abxaes.js → diagram-S7CK7UJ4-m6aeoe7c.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-mekq7zgq.js → diagram-UQ7AKVKN-jall3j0x.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-fnky6lvc.js → diagram-VSXAHHWV-hbawi7hn.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-xe6r5qfw.js → diagram-VX7I27RA-hendl2tt.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-nq07dg7k.js → diagram-Z3DM3KII-igwc35p3.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-c62ipm3g.js → ebnfDiagram-PWID7BFC-c64knz08.js} +1 -1
- package/static/dist/assets/{erDiagram-RLTQ6QDP-h39kmnzy.js → erDiagram-RLTQ6QDP-brdu9lcm.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-njk1j8wl.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-nma6f0ga.js +1 -0
- package/static/dist/assets/folder-plus-lvt9kudb.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ngbsyp37.js → ganttDiagram-EL5Y4UJY-ma6jxj5i.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-fr2i7caa.js → gitGraph-4MIJSDKK-naa9w6xa.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-eravdti4.js → gitGraphDiagram-WWUBYQGX-hzltvsod.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-jwpop9p8.js → highlighted-body-KPVGNVTW-ghoavj8d.js} +1 -1
- package/static/dist/assets/host-hzm8n85n.js +1 -0
- package/static/dist/assets/index-drdcaqeq.css +2 -0
- package/static/dist/assets/index-jzm844he.js +11 -0
- package/static/dist/assets/{info-A6RAGUB7-h11x0dxo.js → info-A6RAGUB7-mn2ut5ko.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-dfh47dw9.js → infoDiagram-27XIBGKW-h6kuqvsb.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-i6ypq351.js → ishikawaDiagram-5VMMS53U-e7bnwq7h.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-lduf1z95.js → journeyDiagram-3NMN7TZE-etd1bi6p.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-e18bu4pg.js → kanban-definition-UXKFOSKX-emb1g9dz.js} +4 -4
- package/static/dist/assets/lazyRouteComponent-o816ytzl.js +1 -0
- package/static/dist/assets/{line-meizqsvn.js → line-h0ojzsvs.js} +1 -1
- package/static/dist/assets/link-k01ryaf9.js +1 -0
- package/static/dist/assets/login-bsae49ew.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-ihl34s74.js +1 -0
- package/static/dist/assets/{mermaid-parser.core-ntne45i9.js → mermaid-parser.core-bnre27u8.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-27b26eok.js → mindmap-definition-YA3MSWOX-o1vathns.js} +1 -1
- package/static/dist/assets/onboarding-c65tysya.js +1 -0
- package/static/dist/assets/onboarding_model_label-gpn28uix.js +1 -0
- package/static/dist/assets/{packet-AYTQ26CC-l6jdka8p.js → packet-AYTQ26CC-hatq7m2e.js} +1 -1
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/{pegDiagram-XKGWAZYB-g1er3bxj.js → pegDiagram-XKGWAZYB-gwisz8jv.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-i0ylcrt9.js → pie-WAS4IAKB-fpftf0mk.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-fbz1e55z.js → pieDiagram-E7YTZNPT-khm1o9a6.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-hhue7d8o.js → quadrantDiagram-AXDQQJYC-owqc4uqn.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-f9b70aa4.js → radar-RG4KPBEZ-cntfwjpq.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-lgsuoeda.js → railroad-74A4TZTK-a7t5eibp.js} +1 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-ol8cdktf.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-i8vzd429.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-nw3ulewz.js +1 -0
- package/static/dist/assets/{railroadDiagram-O6MQD6OU-eqpy9fnz.js → railroadDiagram-O6MQD6OU-etuh0qa0.js} +1 -1
- package/static/dist/assets/{refresh-cw-hlwb02qv.js → refresh-cw-mqbkv2a3.js} +1 -1
- package/static/dist/assets/refresh-l29ljp76.js +1 -0
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-ogf6puhi.js → requirementDiagram-BXWQKSXE-oq2ulk22.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-fqb8xcjf.js → sankeyDiagram-P5KCCOFB-iqc02emv.js} +1 -1
- package/static/dist/assets/saved-ndd4t2xb.js +1 -0
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-dlcz6qjz.js → sequenceDiagram-WJ2MYXX4-i0v116q0.js} +2 -2
- package/static/dist/assets/settings_section_extensions_title-jhfo6o8z.js +1 -0
- package/static/dist/assets/share._token-c1ri0hy1.js +2 -0
- package/static/dist/assets/sliders-horizontal-j3jjt9tv.js +1 -0
- package/static/dist/assets/{stateDiagram-D77RDMKH-fyoznpcs.js → stateDiagram-D77RDMKH-dnpt1ato.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-oefldhfy.js → swimlanes-42K2YHIH-loqbdazb.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-b1vl2zil.js → timeline-definition-24CTP7MA-ol2hnvma.js} +1 -1
- package/static/dist/assets/toast-i3h34v6o.js +64 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-f7hcci5o.js → treeView-Q6P3EWNA-idrj6iox.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-nl85071a.js → treemap-WGGIJYW6-lzr49vv5.js} +1 -1
- package/static/dist/assets/untitled-oaoya4qj.js +1 -0
- package/static/dist/assets/useForm-nfaxgmsk.js +1 -0
- package/static/dist/assets/{useParams-b4dq6n4q.js → useParams-gjc70qru.js} +1 -1
- package/static/dist/assets/{useSearch-ipfmv3he.js → useSearch-e6ae539u.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-h5hzbk0n.js → vennDiagram-4TSXK5OY-bvwr9o2z.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-jftvpm3e.js → wardley-WFR3VGLG-31ui8tma.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-hedh85ge.js → wardleyDiagram-VM6X3IG4-k5wqtx4b.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-e49523ab.js → xychartDiagram-S5SC5T6Z-aqbgvujg.js} +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +1 -1
- 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/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.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.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/architecture-7GRP2DOG-6crvnylg.js +0 -1
- 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/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/endpoints-klbxod4t.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-obfede4u.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-kdpsp1je.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/lazyRouteComponent-e1y4t2i9.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/onboarding-lkphzu1s.js +0 -1
- package/static/dist/assets/onboarding_model_label-ftpjdwqk.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/refresh-abtu93ke.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/sliders-horizontal-n1zm34qq.js +0 -1
- package/static/dist/assets/sse-iwku0sjo.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-ixhx8r46.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/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
|
@@ -7,12 +7,14 @@
|
|
|
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;
|
|
18
20
|
const EMIT_COALESCE_WINDOW_S = 1;
|
|
@@ -22,6 +24,13 @@ const WAKEUP_BATCH_MAX_CHARS = 24_000;
|
|
|
22
24
|
/** A session with held wakeups rechecks its pause at least this often (a credential edit has no deadline). */
|
|
23
25
|
const HELD_RECHECK_SECONDS = 300;
|
|
24
26
|
const DELIVERY_CONSUMER = 'webui';
|
|
27
|
+
const canonicalHome = (home) => { try {
|
|
28
|
+
return realpathSync(home);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return resolve(home);
|
|
32
|
+
} };
|
|
33
|
+
const completionKey = (home, event) => event.type === 'async_delegation' && event.delegation_id && !event.task_failure_notice ? JSON.stringify([canonicalHome(home), str(event.delegation_id)]) : '';
|
|
25
34
|
/** Python `format_wakeup_prompt` for plain completion events; async delegations use the sidecar formatter. */
|
|
26
35
|
export function formatWakeupPrompt(evt) {
|
|
27
36
|
const type = str(evt.type ?? 'completion');
|
|
@@ -38,7 +47,7 @@ export function formatWakeupPrompt(evt) {
|
|
|
38
47
|
body += `\n(${str(evt.suppressed)} earlier matches were suppressed by rate limit)`;
|
|
39
48
|
return body + ']';
|
|
40
49
|
}
|
|
41
|
-
if (
|
|
50
|
+
if (backgroundEventKind(evt) !== 'completion')
|
|
42
51
|
return null;
|
|
43
52
|
if (!(sid || cmd || 'exit_code' in evt || evt.output))
|
|
44
53
|
return null;
|
|
@@ -75,9 +84,22 @@ export class CompletionDrain {
|
|
|
75
84
|
unreleased = new Map();
|
|
76
85
|
/** TAL-576: wakeups held while their session is paused. */
|
|
77
86
|
heldWakeups;
|
|
87
|
+
/** Waiting requires an unadmitted result, not an admitted turn's outstanding ledger acknowledgement. */
|
|
88
|
+
async pendingDelegations(sid) {
|
|
89
|
+
try {
|
|
90
|
+
const session = (await this.deps.store.get(sid)), home = this.ownerHome(session);
|
|
91
|
+
return new Set((await this.heldWakeups.get(sid)).filter((entry) => {
|
|
92
|
+
const key = completionKey(home, entry.event ?? {});
|
|
93
|
+
return Boolean(key) && !completionAccepted(session, key);
|
|
94
|
+
}).map((entry) => str(entry.event?.delegation_id)).filter(Boolean));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return new Set();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
78
100
|
constructor(deps) {
|
|
79
101
|
this.deps = deps;
|
|
80
|
-
this.heldWakeups = new HeldWakeups(
|
|
102
|
+
this.heldWakeups = new HeldWakeups(deps.documents);
|
|
81
103
|
}
|
|
82
104
|
start() {
|
|
83
105
|
if (this.timer || this.stopped)
|
|
@@ -133,7 +155,7 @@ export class CompletionDrain {
|
|
|
133
155
|
}
|
|
134
156
|
// TAL-576: whether or not every profile recovered, the sessions left holding wakeups resume once a sidecar answers.
|
|
135
157
|
if (!this.heldResumed)
|
|
136
|
-
this.resumeHeld();
|
|
158
|
+
(await this.resumeHeld());
|
|
137
159
|
// The drain is sidecar-wide; an active profile whose home escapes the profiles root (`profileHome` throws) scopes it
|
|
138
160
|
// to the base home instead of stalling every other profile's completions.
|
|
139
161
|
let scope;
|
|
@@ -166,19 +188,19 @@ export class CompletionDrain {
|
|
|
166
188
|
}
|
|
167
189
|
return routed;
|
|
168
190
|
}
|
|
169
|
-
resolveTarget(evt) {
|
|
191
|
+
async resolveTarget(evt) {
|
|
170
192
|
const sessionKey = str(evt.session_key).trim();
|
|
171
193
|
const origin = str(evt.origin_ui_session_id).trim();
|
|
172
|
-
const live = (sid) => { if (!sid)
|
|
194
|
+
const live = async (sid) => { if (!sid)
|
|
173
195
|
return ''; try {
|
|
174
|
-
this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false });
|
|
196
|
+
(await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }));
|
|
175
197
|
return sid;
|
|
176
198
|
}
|
|
177
199
|
catch {
|
|
178
200
|
return '';
|
|
179
201
|
} };
|
|
180
|
-
const resolved = live(sessionKey);
|
|
181
|
-
const owner = live(origin);
|
|
202
|
+
const resolved = (await live(sessionKey));
|
|
203
|
+
const owner = (await live(origin));
|
|
182
204
|
if (!owner)
|
|
183
205
|
return resolved;
|
|
184
206
|
if (resolved && resolved !== owner)
|
|
@@ -192,7 +214,8 @@ export class CompletionDrain {
|
|
|
192
214
|
return false;
|
|
193
215
|
}
|
|
194
216
|
async wakeupPrompt(evt) {
|
|
195
|
-
|
|
217
|
+
const kind = backgroundEventKind(evt);
|
|
218
|
+
if (kind === 'delegation' || kind === 'progress') {
|
|
196
219
|
const sidecar = this.deps.sidecar();
|
|
197
220
|
if (!sidecar)
|
|
198
221
|
return '';
|
|
@@ -205,30 +228,175 @@ export class CompletionDrain {
|
|
|
205
228
|
}
|
|
206
229
|
return (formatWakeupPrompt(evt) ?? '').trim();
|
|
207
230
|
}
|
|
231
|
+
/** The session's owning profile home; a session without a profile belongs to the root profile (`profilesMatch`). */
|
|
232
|
+
ownerHome(session) { return this.deps.profileHome(session.profile ?? 'default'); }
|
|
233
|
+
/** A profile's config; null when it cannot be read. */
|
|
234
|
+
async profileConfig(home) {
|
|
235
|
+
try {
|
|
236
|
+
return (await this.deps.readConfig?.(home)) ?? {};
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/** The owning profile's `delegation.surface_child_process_notifications`; off, the Agent's default, when it cannot be read. */
|
|
243
|
+
async surfacesChildProcesses(sid) {
|
|
244
|
+
let config;
|
|
245
|
+
try {
|
|
246
|
+
config = await this.profileConfig(this.ownerHome((await this.deps.store.get(sid, { metadataOnly: true, promote: false, cacheOnMiss: false }))));
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
return isDict(config?.delegation) && config.delegation.surface_child_process_notifications === true;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* TAL-907 (Agent `_load_background_notifications_mode`): `HERMES_BACKGROUND_NOTIFICATIONS` from the profile's `.env`
|
|
255
|
+
* (which overrides the shell, as in the Agent) or the server environment, else `display.background_process_notifications`
|
|
256
|
+
* (YAML `false` is off). Only `off` changes Web delivery; null when the setting cannot be read.
|
|
257
|
+
*/
|
|
258
|
+
async notificationsOff(home) {
|
|
259
|
+
let mode;
|
|
260
|
+
try {
|
|
261
|
+
mode = expandDotenv(parseDotenv(readFileSync(join(home, '.env'), 'utf8')), this.deps.env ?? {}).HERMES_BACKGROUND_NOTIFICATIONS?.trim();
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
if (error.code !== 'ENOENT')
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
mode ||= this.deps.env?.HERMES_BACKGROUND_NOTIFICATIONS?.trim();
|
|
268
|
+
if (!mode) {
|
|
269
|
+
const config = await this.profileConfig(home);
|
|
270
|
+
if (!config)
|
|
271
|
+
return null;
|
|
272
|
+
mode = isDict(config.display) ? config.display.background_process_notifications : undefined;
|
|
273
|
+
}
|
|
274
|
+
return mode === false || str(mode).trim().toLowerCase() === 'off';
|
|
275
|
+
}
|
|
276
|
+
async isReadOnly(session) { return await this.deps.isReadOnly?.(session) ?? session.read_only; }
|
|
277
|
+
/** Hand durable results back without acknowledging delivery or mutating the canonical session. */
|
|
278
|
+
async relinquish(sid, session, entries, claims = []) {
|
|
279
|
+
try {
|
|
280
|
+
if (!(await this.settleClaims(this.ownerHome(session), 'process.defer_delivery', claims)))
|
|
281
|
+
throw new Error('delivery claim could not be returned');
|
|
282
|
+
const events = entries.flatMap((e) => e.event?.type === 'async_delegation' ? [e.event] : []);
|
|
283
|
+
if (events.length) {
|
|
284
|
+
const sidecar = this.deps.sidecar();
|
|
285
|
+
if (!sidecar)
|
|
286
|
+
throw new Error('sidecar unavailable');
|
|
287
|
+
await sidecar.call('process.requeue', { events });
|
|
288
|
+
}
|
|
289
|
+
this.deferred.delete(sid);
|
|
290
|
+
this.pendingSessions.delete(sid);
|
|
291
|
+
this.retryAttempts.delete(sid);
|
|
292
|
+
const timer = this.retryTimers.get(sid);
|
|
293
|
+
if (timer)
|
|
294
|
+
clearTimeout(timer);
|
|
295
|
+
this.retryTimers.delete(sid);
|
|
296
|
+
await this.release(sid);
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
for (const entry of entries)
|
|
300
|
+
this.defer(sid, entry);
|
|
301
|
+
this.scheduleRetry(sid);
|
|
302
|
+
this.deps.log(`[webui] WARNING: completion hand-back failed for ${sid}: ${error.message}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
208
305
|
/** Python `_process_one`; returns false when the event has no owning WebUI session. */
|
|
209
306
|
async processOne(evt) {
|
|
210
307
|
const processId = str(evt.process_id).trim();
|
|
211
|
-
const sid = this.resolveTarget(evt);
|
|
308
|
+
const sid = (await this.resolveTarget(evt));
|
|
212
309
|
if (!sid)
|
|
213
310
|
return false;
|
|
311
|
+
let owner;
|
|
312
|
+
let home;
|
|
313
|
+
let homeError = '';
|
|
314
|
+
try {
|
|
315
|
+
owner = (await this.deps.store.get(sid));
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
home = this.ownerHome(owner);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
home = '';
|
|
325
|
+
homeError = error.message;
|
|
326
|
+
}
|
|
327
|
+
if (home && (await this.isReadOnly(owner)))
|
|
328
|
+
return false;
|
|
329
|
+
// Reconciliation needs positive profile proof; live events retain the existing admission deferral on home errors.
|
|
330
|
+
if (evt.reconciliation_profile_home && (!home || canonicalHome(str(evt.reconciliation_profile_home)) !== canonicalHome(home)))
|
|
331
|
+
return false;
|
|
332
|
+
if (evt.reconciliation_profile_home && completionAccepted(owner, completionKey(home, evt)))
|
|
333
|
+
return true;
|
|
214
334
|
if (evt.consumed === true)
|
|
215
335
|
return true;
|
|
336
|
+
// TAL-933 (Agent `should_surface_notification`): a subagent's own process notices stay out of the parent chat unless
|
|
337
|
+
// the session's profile opts in. Dropped, not consumed, as in the Agent: an exit nobody read still reaches the parent
|
|
338
|
+
// as the child's `unread_completions`.
|
|
339
|
+
if (evt.child_process === true && !(await this.surfacesChildProcesses(sid)))
|
|
340
|
+
return true;
|
|
216
341
|
const seen = this.seen.get(sid) ?? new Set();
|
|
217
342
|
this.seen.set(sid, seen);
|
|
218
343
|
// Only a per-process delivery can repeat: a watch event's key is unique, so remembering it would only grow `seen`.
|
|
219
344
|
if (processId && deliveredPerProcess(evt)) {
|
|
220
345
|
if (seen.has(processId))
|
|
221
346
|
return true;
|
|
222
|
-
seen.add(processId);
|
|
223
347
|
}
|
|
224
|
-
this.pendingSessions.add(sid);
|
|
225
348
|
const prompt = await this.wakeupPrompt(evt);
|
|
226
|
-
this.
|
|
227
|
-
|
|
228
|
-
|
|
349
|
+
if ((await this.isReadOnly(owner))) {
|
|
350
|
+
if (home)
|
|
351
|
+
return false;
|
|
352
|
+
this.defer(sid, { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt });
|
|
353
|
+
this.scheduleRetry(sid);
|
|
354
|
+
this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${homeError || 'ownership home unavailable'}; retrying`);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
if (evt.reconciliation_profile_home && evt.delegation_id && prompt.includes(str(evt.delegation_id))) {
|
|
358
|
+
// Upgrade a proven pre-receipt Web turn; typed Agent bookkeeping alone never qualifies.
|
|
359
|
+
const previous = owner.messages.find((m) => m._source === 'process_wakeup' && m._turn_id && messageText(m.content) === prompt);
|
|
360
|
+
const turnId = str(previous?._turn_id) || (owner.pending_user_source === 'process_wakeup' && owner.pending_user_message === prompt ? str(owner.active_stream_id) : '');
|
|
361
|
+
if (turnId) {
|
|
362
|
+
const receipts = isDict(owner.extra.completion_acceptances) ? owner.extra.completion_acceptances : {};
|
|
363
|
+
owner.extra.completion_acceptances = { ...receipts, [completionKey(home, evt)]: turnId };
|
|
364
|
+
await this.deps.store.save(owner, { touchUpdatedAt: false });
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// The formatter awaits the sidecar; another drain may have retained this event meanwhile.
|
|
369
|
+
if (processId && deliveredPerProcess(evt) && seen.has(processId))
|
|
229
370
|
return true;
|
|
230
371
|
const entry = { process_id: deliveryKey(evt, processId), wakeup_prompt: prompt, event: evt };
|
|
231
|
-
if (
|
|
372
|
+
if (prompt && evt.type === 'async_delegation')
|
|
373
|
+
this.defer(sid, entry);
|
|
374
|
+
if (prompt && evt.type === 'async_delegation' && !evt.task_failure_notice) {
|
|
375
|
+
try {
|
|
376
|
+
// Busy, Stop, sealed and provider-paused entries survive either process restarting.
|
|
377
|
+
await this.heldWakeups.hold(sid, [entry]);
|
|
378
|
+
recordBackgroundUpdate(owner, `delegation:${str(evt.delegation_id)}`, batchUpdate([{ event: evt, prompt }]));
|
|
379
|
+
await this.deps.store.save(owner, { touchUpdatedAt: false });
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
this.scheduleRetry(sid);
|
|
383
|
+
this.deps.log(`[webui] WARNING: failed to persist delegation wakeup for session ${sid}; retained in memory for retry: ${error.message}`);
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (processId && deliveredPerProcess(evt))
|
|
388
|
+
seen.add(processId);
|
|
389
|
+
this.pendingSessions.add(sid);
|
|
390
|
+
await this.deps.background?.recordEvent(sid, evt, prompt);
|
|
391
|
+
if (backgroundEventKind(evt) !== 'progress')
|
|
392
|
+
this.emitCoalesced(sid, this.buildPayload(evt, sid, prompt));
|
|
393
|
+
if (!prompt)
|
|
394
|
+
return true;
|
|
395
|
+
if (evt.type === 'async_delegation') {
|
|
396
|
+
if (!this.hasActiveTurn(sid))
|
|
397
|
+
await this.drainDeferred(sid);
|
|
398
|
+
}
|
|
399
|
+
else if (this.hasActiveTurn(sid))
|
|
232
400
|
this.defer(sid, entry);
|
|
233
401
|
else
|
|
234
402
|
await this.startWakeup(sid, [entry]);
|
|
@@ -313,10 +481,12 @@ export class CompletionDrain {
|
|
|
313
481
|
* another consumer delivered (or holds) it, so it leaves the batch; a sidecar failure returns null so the caller keeps
|
|
314
482
|
* every entry pending. Claims are taken at delivery, never while deferred, so a long turn cannot outlive the lease.
|
|
315
483
|
*/
|
|
316
|
-
async claimBatch(home, batched) {
|
|
484
|
+
async claimBatch(home, batched, session) {
|
|
317
485
|
const deliver = [];
|
|
318
486
|
const held = [];
|
|
319
487
|
for (const entry of batched) {
|
|
488
|
+
if ((await this.isReadOnly(session)))
|
|
489
|
+
break;
|
|
320
490
|
if (entry.event?.type !== 'async_delegation') {
|
|
321
491
|
deliver.push(entry);
|
|
322
492
|
continue;
|
|
@@ -326,7 +496,10 @@ export class CompletionDrain {
|
|
|
326
496
|
try {
|
|
327
497
|
if (!sidecar)
|
|
328
498
|
throw new Error('sidecar unavailable');
|
|
329
|
-
|
|
499
|
+
const claim = await sidecar.call('process.claim_delivery', { profile_home: home, event: entry.event, consumer: DELIVERY_CONSUMER });
|
|
500
|
+
if (claim.retryable)
|
|
501
|
+
throw new Error('another consumer holds the pending result');
|
|
502
|
+
claimId = claim.claim_id;
|
|
330
503
|
}
|
|
331
504
|
catch (error) {
|
|
332
505
|
await this.settleClaims(home, 'process.release_delivery', held);
|
|
@@ -349,15 +522,18 @@ export class CompletionDrain {
|
|
|
349
522
|
async settleClaims(home, method, held) {
|
|
350
523
|
const sidecar = this.deps.sidecar();
|
|
351
524
|
if (!sidecar)
|
|
352
|
-
return;
|
|
525
|
+
return held.length === 0;
|
|
526
|
+
let ok = true;
|
|
353
527
|
for (const claim of held) {
|
|
354
528
|
try {
|
|
355
529
|
await sidecar.call(method, { profile_home: home, event: claim.event, claim_id: claim.claim_id });
|
|
356
530
|
}
|
|
357
531
|
catch (error) {
|
|
532
|
+
ok = false;
|
|
358
533
|
this.deps.log(`[webui] WARNING: ${method} failed for ${str(claim.event.delegation_id)}: ${error.message}`);
|
|
359
534
|
}
|
|
360
535
|
}
|
|
536
|
+
return ok;
|
|
361
537
|
}
|
|
362
538
|
scheduleRetry(sid) {
|
|
363
539
|
const attempts = (this.retryAttempts.get(sid) ?? 0) + 1;
|
|
@@ -391,10 +567,10 @@ export class CompletionDrain {
|
|
|
391
567
|
}
|
|
392
568
|
}
|
|
393
569
|
/** A restarted server resumes every session it left holding wakeups (`startWakeup` drops a deleted session's). */
|
|
394
|
-
resumeHeld() {
|
|
570
|
+
async resumeHeld() {
|
|
395
571
|
let sids;
|
|
396
572
|
try {
|
|
397
|
-
sids = this.heldWakeups.sessions();
|
|
573
|
+
sids = (await this.heldWakeups.sessions());
|
|
398
574
|
}
|
|
399
575
|
catch (error) {
|
|
400
576
|
this.deps.log(`[webui] WARNING: held wakeups unreadable; retrying: ${error.message}`);
|
|
@@ -404,12 +580,12 @@ export class CompletionDrain {
|
|
|
404
580
|
for (const sid of sids)
|
|
405
581
|
void this.drainDeferred(sid);
|
|
406
582
|
}
|
|
407
|
-
held(sid) {
|
|
583
|
+
async held(sid) {
|
|
408
584
|
if (this.unreleased.has(sid))
|
|
409
|
-
this.release(sid, []);
|
|
585
|
+
(await this.release(sid, []));
|
|
410
586
|
const done = new Set((this.unreleased.get(sid) ?? []).map(heldKey));
|
|
411
587
|
try {
|
|
412
|
-
return this.heldWakeups.get(sid).filter((e) => !done.has(heldKey(e)));
|
|
588
|
+
return (await this.heldWakeups.get(sid)).filter((e) => !done.has(heldKey(e)));
|
|
413
589
|
}
|
|
414
590
|
catch (error) {
|
|
415
591
|
// An unreadable store is unknown, not empty: recheck later rather than leave the session dormant.
|
|
@@ -419,15 +595,15 @@ export class CompletionDrain {
|
|
|
419
595
|
}
|
|
420
596
|
}
|
|
421
597
|
/** A session whose file is gone was deleted; any other load failure keeps its wakeups. */
|
|
422
|
-
deleted(sid, error) {
|
|
423
|
-
return error instanceof SessionNotFound && !
|
|
598
|
+
async deleted(sid, error) {
|
|
599
|
+
return error instanceof SessionNotFound && !await this.deps.store.exists(sid);
|
|
424
600
|
}
|
|
425
601
|
/** Admitted or settled wakeups (every one, with none given) leave the held file. */
|
|
426
|
-
release(sid, entries) {
|
|
602
|
+
async release(sid, entries) {
|
|
427
603
|
// Earlier releases that could not be written go with this one.
|
|
428
604
|
const batch = entries ? mergeWakeups([...(this.unreleased.get(sid) ?? [])], entries) : undefined;
|
|
429
605
|
try {
|
|
430
|
-
this.heldWakeups.release(sid, batch);
|
|
606
|
+
await this.heldWakeups.release(sid, batch);
|
|
431
607
|
this.unreleased.delete(sid);
|
|
432
608
|
}
|
|
433
609
|
catch (error) {
|
|
@@ -436,9 +612,9 @@ export class CompletionDrain {
|
|
|
436
612
|
this.deps.log(`[webui] WARNING: failed to release held wakeups for session ${sid}; they are not delivered again: ${error.message}`);
|
|
437
613
|
}
|
|
438
614
|
}
|
|
439
|
-
saveSession(sid, session) {
|
|
615
|
+
async saveSession(sid, session) {
|
|
440
616
|
try {
|
|
441
|
-
this.deps.store.save(session, { touchUpdatedAt: false });
|
|
617
|
+
(await this.deps.store.save(session, { touchUpdatedAt: false }));
|
|
442
618
|
}
|
|
443
619
|
catch (error) {
|
|
444
620
|
this.deps.log(`[webui] WARNING: failed to save wakeup pause for session ${sid}: ${error.message}`);
|
|
@@ -450,10 +626,14 @@ export class CompletionDrain {
|
|
|
450
626
|
* Returns whether the wakeup is handled here (held, or dropped with its deleted session).
|
|
451
627
|
*/
|
|
452
628
|
async holdWhilePaused(sid, session, home, batched) {
|
|
629
|
+
if ((await this.isReadOnly(session))) {
|
|
630
|
+
await this.relinquish(sid, session, batched);
|
|
631
|
+
return true;
|
|
632
|
+
}
|
|
453
633
|
const pause = session.process_wakeup_pause;
|
|
454
634
|
if (!wakeupPaused(session, home, this.deps.configPath?.(home))) {
|
|
455
635
|
if (pause !== session.process_wakeup_pause)
|
|
456
|
-
this.saveSession(sid, session);
|
|
636
|
+
(await this.saveSession(sid, session));
|
|
457
637
|
return false;
|
|
458
638
|
}
|
|
459
639
|
const recovery = await this.poolRecovery(home, session);
|
|
@@ -461,26 +641,30 @@ export class CompletionDrain {
|
|
|
461
641
|
// A deleted session owns no turn; a transient load failure holds the wakeups for the next recheck.
|
|
462
642
|
let current = null;
|
|
463
643
|
try {
|
|
464
|
-
current = this.deps.store.get(sid);
|
|
644
|
+
current = (await this.deps.store.get(sid));
|
|
465
645
|
}
|
|
466
646
|
catch (error) {
|
|
467
|
-
if (this.deleted(sid, error)) {
|
|
468
|
-
this.release(sid);
|
|
647
|
+
if ((await this.deleted(sid, error))) {
|
|
648
|
+
(await this.release(sid));
|
|
469
649
|
return true;
|
|
470
650
|
}
|
|
471
651
|
}
|
|
472
652
|
if (current) {
|
|
653
|
+
if ((await this.isReadOnly(current))) {
|
|
654
|
+
await this.relinquish(sid, current, batched);
|
|
655
|
+
return true;
|
|
656
|
+
}
|
|
473
657
|
const before = current.process_wakeup_pause;
|
|
474
658
|
if (recovery === true)
|
|
475
659
|
current.process_wakeup_pause = null;
|
|
476
660
|
if (recovery === true || !wakeupPaused(current, home, this.deps.configPath?.(home))) {
|
|
477
661
|
if (before !== current.process_wakeup_pause)
|
|
478
|
-
this.saveSession(sid, current);
|
|
662
|
+
(await this.saveSession(sid, current));
|
|
479
663
|
return false;
|
|
480
664
|
}
|
|
481
665
|
}
|
|
482
666
|
try {
|
|
483
|
-
this.heldWakeups.hold(sid, batched);
|
|
667
|
+
(await this.heldWakeups.hold(sid, batched));
|
|
484
668
|
}
|
|
485
669
|
catch (error) {
|
|
486
670
|
for (const e of batched)
|
|
@@ -493,17 +677,18 @@ export class CompletionDrain {
|
|
|
493
677
|
return true;
|
|
494
678
|
}
|
|
495
679
|
/** Python `_start_server_side_wakeup_turn`: one batched turn; 409 re-defers, other failures re-defer with a timed retry. */
|
|
496
|
-
async startWakeup(sid,
|
|
680
|
+
async startWakeup(sid, wakeups) {
|
|
681
|
+
let batched = wakeups;
|
|
497
682
|
const redefer = (entries) => { for (const e of entries)
|
|
498
683
|
this.defer(sid, e); };
|
|
499
684
|
let session;
|
|
500
685
|
try {
|
|
501
|
-
session = this.deps.store.get(sid);
|
|
686
|
+
session = (await this.deps.store.get(sid));
|
|
502
687
|
}
|
|
503
688
|
catch (error) {
|
|
504
689
|
// A deleted session owns no turn: its wakeups, held ones included, go with it.
|
|
505
|
-
if (this.deleted(sid, error)) {
|
|
506
|
-
this.release(sid);
|
|
690
|
+
if ((await this.deleted(sid, error))) {
|
|
691
|
+
(await this.release(sid));
|
|
507
692
|
this.deps.log(`[webui] server-side wakeup dropped for deleted session ${sid}`);
|
|
508
693
|
return false;
|
|
509
694
|
}
|
|
@@ -520,25 +705,72 @@ export class CompletionDrain {
|
|
|
520
705
|
// TAL-534: the delegation's ledger row lives in the session's own profile, whichever profile is active now.
|
|
521
706
|
let home;
|
|
522
707
|
try {
|
|
523
|
-
home = this.
|
|
708
|
+
home = this.ownerHome(session);
|
|
524
709
|
}
|
|
525
710
|
catch (error) {
|
|
526
711
|
redefer(batched);
|
|
527
712
|
this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: ${error.message}`);
|
|
528
713
|
return false;
|
|
529
714
|
}
|
|
715
|
+
if ((await this.isReadOnly(session))) {
|
|
716
|
+
await this.relinquish(sid, session, batched);
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
const accepted = batched.filter((e) => completionAccepted(session, completionKey(home, e.event ?? {})));
|
|
720
|
+
if (accepted.length) {
|
|
721
|
+
// A crash may have saved admission before acknowledging the Agent. Finish that handshake without a new turn.
|
|
722
|
+
const claims = await this.claimBatch(home, accepted, session);
|
|
723
|
+
if (claims && (await this.isReadOnly(session))) {
|
|
724
|
+
await this.relinquish(sid, session, batched, claims.held);
|
|
725
|
+
return false;
|
|
726
|
+
}
|
|
727
|
+
if (!claims || !(await this.settleClaims(home, 'process.complete_delivery', claims.held))) {
|
|
728
|
+
redefer(batched);
|
|
729
|
+
this.scheduleRetry(sid);
|
|
730
|
+
return false;
|
|
731
|
+
}
|
|
732
|
+
await this.release(sid, accepted);
|
|
733
|
+
batched = batched.filter((e) => !accepted.includes(e));
|
|
734
|
+
}
|
|
735
|
+
if (!batched.length)
|
|
736
|
+
return false;
|
|
737
|
+
// TAL-907: `off` mutes process-driven wakeups at delivery, so a deferred or held wakeup follows the current setting; the
|
|
738
|
+
// drained event's record and status row are its whole delivery. A subagent result is not a process notification and
|
|
739
|
+
// still lands, as in the Agent. A setting that cannot be read retains the wakeups rather than start a turn.
|
|
740
|
+
const muted = batched.filter((e) => e.event?.type !== 'async_delegation');
|
|
741
|
+
if (muted.length) {
|
|
742
|
+
const off = await this.notificationsOff(home);
|
|
743
|
+
if (off === null) {
|
|
744
|
+
redefer(batched);
|
|
745
|
+
this.scheduleRetry(sid);
|
|
746
|
+
this.deps.log(`[webui] WARNING: server-side wakeup retained for session ${sid}: background_process_notifications is unreadable; retrying`);
|
|
747
|
+
return false;
|
|
748
|
+
}
|
|
749
|
+
if (off) {
|
|
750
|
+
await this.release(sid, muted);
|
|
751
|
+
batched = batched.filter((e) => !muted.includes(e));
|
|
752
|
+
if (!batched.length) {
|
|
753
|
+
this.retryAttempts.delete(sid);
|
|
754
|
+
return false;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
530
758
|
if (await this.holdWhilePaused(sid, session, home, batched))
|
|
531
759
|
return false;
|
|
532
|
-
const claimed = await this.claimBatch(home, batched);
|
|
760
|
+
const claimed = await this.claimBatch(home, batched, session);
|
|
533
761
|
if (!claimed) {
|
|
534
762
|
redefer(batched);
|
|
535
763
|
this.scheduleRetry(sid);
|
|
536
764
|
return false;
|
|
537
765
|
}
|
|
538
766
|
const { deliver, held } = claimed;
|
|
767
|
+
if ((await this.isReadOnly(session))) {
|
|
768
|
+
await this.relinquish(sid, session, batched, held);
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
539
771
|
// Entries another consumer already delivered are done here too.
|
|
540
772
|
if (!deliver.length) {
|
|
541
|
-
this.release(sid, batched);
|
|
773
|
+
(await this.release(sid, batched));
|
|
542
774
|
await this.markConsumed(batched);
|
|
543
775
|
return true;
|
|
544
776
|
}
|
|
@@ -547,7 +779,7 @@ export class CompletionDrain {
|
|
|
547
779
|
const prompt = deliver.length === 1 ? deliver[0].wakeup_prompt : deliver.map((e) => e.wakeup_prompt).join('\n\n');
|
|
548
780
|
let resp;
|
|
549
781
|
try {
|
|
550
|
-
resp = await this.deps.startTurn(session, prompt);
|
|
782
|
+
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
783
|
}
|
|
552
784
|
catch (error) {
|
|
553
785
|
await giveBack();
|
|
@@ -555,6 +787,10 @@ export class CompletionDrain {
|
|
|
555
787
|
this.deps.log(`[webui] WARNING: server-side wakeup turn raised for session ${sid}: ${error.message}`);
|
|
556
788
|
return false;
|
|
557
789
|
}
|
|
790
|
+
if ((await this.isReadOnly(session))) {
|
|
791
|
+
await this.relinquish(sid, session, batched, held);
|
|
792
|
+
return false;
|
|
793
|
+
}
|
|
558
794
|
const status = resp._status ?? (resp.stream_id ? 200 : 500);
|
|
559
795
|
// A busy session redelivers at its turn teardown; a stale runtime admits no turn, so it is retried on a timer (TAL-577).
|
|
560
796
|
if (status === 409) {
|
|
@@ -570,9 +806,14 @@ export class CompletionDrain {
|
|
|
570
806
|
return false;
|
|
571
807
|
}
|
|
572
808
|
this.retryAttempts.delete(sid);
|
|
573
|
-
this.release(sid, batched);
|
|
574
809
|
recordBackgroundUpdate(session, str(resp.stream_id), batchUpdate(deliver.map((e) => ({ event: e.event ?? {}, prompt: e.wakeup_prompt }))));
|
|
575
|
-
await this.
|
|
810
|
+
await this.saveSession(sid, session);
|
|
811
|
+
if (await this.settleClaims(home, 'process.complete_delivery', held))
|
|
812
|
+
(await this.release(sid, batched));
|
|
813
|
+
else {
|
|
814
|
+
redefer(deliver);
|
|
815
|
+
this.scheduleRetry(sid);
|
|
816
|
+
}
|
|
576
817
|
await this.markConsumed(batched);
|
|
577
818
|
this.deps.log(`[webui] server-side wakeup turn started for session ${sid} (stream_id=${str(resp.stream_id)})`);
|
|
578
819
|
return true;
|
|
@@ -601,7 +842,7 @@ export class CompletionDrain {
|
|
|
601
842
|
* TAL-576: one drain per session at a time, so two never copy the same held wakeups before either admits them.
|
|
602
843
|
*/
|
|
603
844
|
drainDeferred(sid) {
|
|
604
|
-
const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(() => this.drainDeferredNow(sid));
|
|
845
|
+
const run = (this.drains.get(sid) ?? Promise.resolve(0)).catch(() => 0).then(async () => (await this.drainDeferredNow(sid)));
|
|
605
846
|
this.drains.set(sid, run);
|
|
606
847
|
void run.finally(() => { if (this.drains.get(sid) === run)
|
|
607
848
|
this.drains.delete(sid); }).catch(() => undefined);
|
|
@@ -610,7 +851,7 @@ export class CompletionDrain {
|
|
|
610
851
|
async drainDeferredNow(sid) {
|
|
611
852
|
if (!sid || this.hasActiveTurn(sid))
|
|
612
853
|
return 0;
|
|
613
|
-
const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], this.held(sid));
|
|
854
|
+
const entries = mergeWakeups([...(this.deferred.get(sid) ?? [])], (await this.held(sid)));
|
|
614
855
|
if (!entries.length)
|
|
615
856
|
return 0;
|
|
616
857
|
this.deferred.delete(sid);
|
|
@@ -618,7 +859,7 @@ export class CompletionDrain {
|
|
|
618
859
|
const prompted = entries.filter((e) => e.wakeup_prompt.trim());
|
|
619
860
|
const held = await this.alreadyConsumed(prompted);
|
|
620
861
|
if (held.size) {
|
|
621
|
-
this.release(sid, [...held]);
|
|
862
|
+
await this.release(sid, [...held]);
|
|
622
863
|
const ids = [...held].map((e) => e.process_id);
|
|
623
864
|
await this.markConsumed([...held]);
|
|
624
865
|
this.deps.log(`[webui] dropped ${String(held.size)} deferred wakeup(s) already consumed by the agent's own turn for session ${sid}: ${ids.join(', ')}`);
|