@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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""``memory.*``: the Agent's ``MemoryStore`` reading of a memory page save (TAL-886) and its compare-and-write (TAL-784)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import errno
|
|
6
|
+
import hashlib
|
|
7
|
+
import os
|
|
8
|
+
import stat
|
|
9
|
+
import threading
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from ..errors import InvalidParams, RpcError
|
|
13
|
+
from ..home import profile_home_param, scoped_home
|
|
14
|
+
from ..rpc import CallContext
|
|
15
|
+
|
|
16
|
+
# Agents without the per-file lock helper: this sidecar's saves still run one at a time.
|
|
17
|
+
_SAVE_LOCK = threading.Lock()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def check(target: str, content: str) -> dict:
|
|
21
|
+
"""``content``'s char count as the Agent's memory tool parses it, and the profile's limit for ``target``."""
|
|
22
|
+
from hermes_cli.config import load_config
|
|
23
|
+
from tools.memory_tool_store import ENTRY_DELIMITER, MemoryStore
|
|
24
|
+
|
|
25
|
+
mem = (load_config() or {}).get("memory") or {}
|
|
26
|
+
store = MemoryStore(**{key: int(mem[key]) for key in ("memory_char_limit", "user_char_limit") if mem.get(key) is not None})
|
|
27
|
+
# The store keeps each entry once (first occurrence wins), as its load and write paths do.
|
|
28
|
+
entries = list(dict.fromkeys(MemoryStore._parse_entries(content)))
|
|
29
|
+
return {"count": len(ENTRY_DELIMITER.join(entries)), "limit": store._char_limit(target)}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _digest(path: Path) -> str | None:
|
|
33
|
+
"""SHA-256 hex of the regular file at ``path`` (of no bytes when there is none), never following a link; None otherwise."""
|
|
34
|
+
try:
|
|
35
|
+
fd = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0) | getattr(os, "O_NONBLOCK", 0))
|
|
36
|
+
except FileNotFoundError:
|
|
37
|
+
return hashlib.sha256(b"").hexdigest()
|
|
38
|
+
except OSError as exc:
|
|
39
|
+
if exc.errno == errno.ELOOP:
|
|
40
|
+
return None
|
|
41
|
+
raise
|
|
42
|
+
with os.fdopen(fd, "rb") as handle:
|
|
43
|
+
if not stat.S_ISREG(os.fstat(handle.fileno()).st_mode):
|
|
44
|
+
return None
|
|
45
|
+
return hashlib.sha256(handle.read()).hexdigest()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def write(home: Path, section: str, base: str, content: str) -> dict:
|
|
49
|
+
"""Replace ``section``'s file with ``content`` only while its bytes still hash to ``base``, the server's read.
|
|
50
|
+
|
|
51
|
+
Each file is checked and written under the Agent's own per-file lock (``<file>.lock``), so neither a memory tool
|
|
52
|
+
call nor a concurrent save can land between the two; an Agent without the lock helper gets this sidecar's lock.
|
|
53
|
+
"""
|
|
54
|
+
from tools.memory_tool_store import MemoryStore
|
|
55
|
+
from utils import atomic_write_text
|
|
56
|
+
|
|
57
|
+
if section not in ("memory", "user", "soul"):
|
|
58
|
+
raise InvalidParams("section must be memory, user, or soul")
|
|
59
|
+
# The files the server read: SOUL.md in the profile home, MEMORY.md / USER.md in its memories folder.
|
|
60
|
+
path = home / "SOUL.md" if section == "soul" else home / "memories" / ("USER.md" if section == "user" else "MEMORY.md")
|
|
61
|
+
file_lock = getattr(MemoryStore, "_file_lock", None)
|
|
62
|
+
try:
|
|
63
|
+
with file_lock(path) if file_lock else _SAVE_LOCK:
|
|
64
|
+
if _digest(path) != base:
|
|
65
|
+
return {"written": False}
|
|
66
|
+
atomic_write_text(path, content, tmp_prefix=".mem_", preserve_mode=True)
|
|
67
|
+
except OSError as exc:
|
|
68
|
+
if exc.errno not in (errno.EACCES, errno.EPERM, errno.EROFS):
|
|
69
|
+
raise
|
|
70
|
+
raise RpcError(f"{path.name} is not writable: {exc.strerror}", condition="memory_not_writable") from exc
|
|
71
|
+
return {"written": True}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def register(registry) -> None:
|
|
75
|
+
@registry.method("memory.check")
|
|
76
|
+
def check_(ctx: CallContext, params: dict) -> dict:
|
|
77
|
+
with scoped_home(profile_home_param(params)):
|
|
78
|
+
return check(str(params["target"]), str(params["content"]))
|
|
79
|
+
|
|
80
|
+
@registry.method("memory.write")
|
|
81
|
+
def write_(ctx: CallContext, params: dict) -> dict:
|
|
82
|
+
home = profile_home_param(params)
|
|
83
|
+
with scoped_home(home):
|
|
84
|
+
return write(home, str(params["section"]), str(params["base"]), str(params["content"]))
|
|
@@ -121,10 +121,13 @@ def _nous_begin() -> tuple[dict, dict]:
|
|
|
121
121
|
from hermes_cli import anon_auth
|
|
122
122
|
from hermes_cli.auth import PROVIDER_REGISTRY, _request_device_code
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
# v0.22.0 replaced ``guest_enabled`` with ``guest_allowed``; 0.21.x releases only have the former.
|
|
125
|
+
guest_gate = getattr(anon_auth, "guest_allowed", None) or getattr(anon_auth, "guest_enabled")
|
|
126
|
+
if guest_gate() and anon_auth.has_guest():
|
|
125
127
|
# The free tier's sign-in moves its connectors to the account (``anon_auth.run_sign_in``); a plain device-code
|
|
126
128
|
# sign-in here would orphan them.
|
|
127
|
-
|
|
129
|
+
hint = getattr(anon_auth, "UPGRADE_HINT", None) or "Sign in from Hermes with `hermes auth upgrade`."
|
|
130
|
+
raise RpcError(f"This profile uses the Nous free tier. {hint}", condition="oauth_unsupported")
|
|
128
131
|
pconfig = PROVIDER_REGISTRY["nous"]
|
|
129
132
|
portal = (os.getenv("HERMES_PORTAL_BASE_URL") or os.getenv("NOUS_PORTAL_BASE_URL") or pconfig.portal_base_url).rstrip("/")
|
|
130
133
|
with _client(15.0) as client:
|
|
@@ -14,7 +14,7 @@ from contextlib import closing
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
|
|
16
16
|
from ..errors import InvalidParams, RpcError
|
|
17
|
-
from ..home import profile_home_param, scoped_home
|
|
17
|
+
from ..home import _PROCESS_HOME, _is_named_profile, profile_home_param, scoped_home
|
|
18
18
|
from ..rpc import CallContext
|
|
19
19
|
|
|
20
20
|
log = logging.getLogger("talaria_sidecar.process")
|
|
@@ -28,11 +28,23 @@ def _registry():
|
|
|
28
28
|
return process_registry
|
|
29
29
|
|
|
30
30
|
|
|
31
|
+
def _is_child_process(row: dict) -> bool:
|
|
32
|
+
"""TAL-933: a subagent's own process notice, which the server surfaces only when the owning profile opts in."""
|
|
33
|
+
try:
|
|
34
|
+
from tools.process_registry_notifications import is_child_process_notification
|
|
35
|
+
except Exception: # noqa: BLE001 - before Agent 0.21.7, the same rule inline
|
|
36
|
+
if row.get("type") in ("async_delegation", "async_delegation_work_closeout"):
|
|
37
|
+
return False
|
|
38
|
+
return str(row.get("owner_task_id") or row.get("task_id") or "").startswith("sa-")
|
|
39
|
+
return bool(is_child_process_notification(row))
|
|
40
|
+
|
|
41
|
+
|
|
31
42
|
def _event_row(evt: dict) -> dict:
|
|
32
43
|
registry = _registry()
|
|
33
44
|
row = {str(k): v for k, v in evt.items()} if isinstance(evt, dict) else {}
|
|
34
45
|
process_id = str(row.get("delegation_id") or row.get("session_id") or row.get("task_id") or "") if row.get("type") == "async_delegation" else str(row.get("session_id") or "")
|
|
35
46
|
row["process_id"] = process_id
|
|
47
|
+
row["child_process"] = _is_child_process(row)
|
|
36
48
|
if registry is not None and process_id and (not row.get("session_key") or not row.get("origin_ui_session_id")):
|
|
37
49
|
try:
|
|
38
50
|
proc = registry.get(process_id)
|
|
@@ -102,12 +114,112 @@ def _publish_recovered_exits(registry) -> None:
|
|
|
102
114
|
_RECOVERED.setdefault(session.id, session)
|
|
103
115
|
|
|
104
116
|
|
|
117
|
+
_COMPLETION_BASE_HOME: Path | None = None
|
|
118
|
+
_RESTORED_COMPLETION_HOMES: set[Path] = set()
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _completion_homes() -> list[Path]:
|
|
122
|
+
from hermes_constants import get_hermes_home
|
|
123
|
+
from .profiles import named_profile_homes
|
|
124
|
+
|
|
125
|
+
homes = [_PROCESS_HOME, Path(get_hermes_home())]
|
|
126
|
+
if _COMPLETION_BASE_HOME is not None:
|
|
127
|
+
# The server drains one global queue. Re-enumerate so new profiles join and removed/escaped ones leave.
|
|
128
|
+
homes += [_COMPLETION_BASE_HOME, *(home for _, home in named_profile_homes(_COMPLETION_BASE_HOME))]
|
|
129
|
+
return list(dict.fromkeys(home.resolve() for home in homes))
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _restore_and_sweep_completions(registry) -> None:
|
|
133
|
+
from tools import async_delegation
|
|
134
|
+
|
|
135
|
+
restore = getattr(registry, "restore_completions", None)
|
|
136
|
+
if not callable(restore):
|
|
137
|
+
return # Older Agents already restore at registry import and have no orphan sweep.
|
|
138
|
+
# The Agent binds the launch home itself, even when the first drain is in a named profile.
|
|
139
|
+
restore()
|
|
140
|
+
for home in _completion_homes():
|
|
141
|
+
try:
|
|
142
|
+
with scoped_home(home):
|
|
143
|
+
if _is_named_profile(home) and home not in _RESTORED_COMPLETION_HOMES:
|
|
144
|
+
async_delegation.restore_undelivered_completions(registry.completion_queue)
|
|
145
|
+
_RESTORED_COMPLETION_HOMES.add(home)
|
|
146
|
+
sweep = getattr(async_delegation, "maybe_sweep_orphaned_completions", None)
|
|
147
|
+
if callable(sweep):
|
|
148
|
+
sweep(registry.completion_queue)
|
|
149
|
+
except Exception: # noqa: BLE001 - retry this home without blocking other profiles or queued events
|
|
150
|
+
log.debug("Failed to restore or sweep delegation completions for %s", home, exc_info=True)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
_DELIVERY_RECONCILE_INTERVAL_S = 30
|
|
154
|
+
_LAST_DELIVERY_RECONCILE: dict[Path, float] = {}
|
|
155
|
+
_DELIVERY_RECONCILE_CURSOR: dict[Path, str] = {}
|
|
156
|
+
_DELIVERY_RECONCILE_PAGE_SIZE = 200
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _delivered_notifications(home: Path, delegation_id: str | None = None, after: str = "") -> tuple[list[dict], str]:
|
|
160
|
+
"""Only typed transcript deliveries, never every delivered ledger row. No Agent state is changed."""
|
|
161
|
+
db_path = home / "state.db"
|
|
162
|
+
if not db_path.exists():
|
|
163
|
+
return [], ""
|
|
164
|
+
with closing(sqlite3.connect(f"{db_path.resolve().as_uri()}?mode=ro", uri=True, timeout=5)) as conn:
|
|
165
|
+
tables = {r[0] for r in conn.execute("SELECT name FROM sqlite_master WHERE type='table'")}
|
|
166
|
+
if not {"async_delegations", "messages", "sessions"} <= tables:
|
|
167
|
+
return [], ""
|
|
168
|
+
rows = conn.execute("""WITH RECURSIVE candidates AS (
|
|
169
|
+
SELECT delegation_id, origin_ui_session_id, parent_session_id, origin_session_id, event_json
|
|
170
|
+
FROM async_delegations WHERE delivery_state='delivered' AND state NOT IN ('running','finalizing')
|
|
171
|
+
AND event_json IS NOT NULL AND origin_ui_session_id != '' AND delivered_at >= ?
|
|
172
|
+
AND (? IS NULL OR delegation_id=?) AND delegation_id > ?
|
|
173
|
+
), lineage(delegation_id, id) AS (
|
|
174
|
+
SELECT delegation_id, parent_session_id FROM candidates WHERE parent_session_id != ''
|
|
175
|
+
UNION SELECT delegation_id, origin_session_id FROM candidates WHERE origin_session_id != ''
|
|
176
|
+
UNION SELECT l.delegation_id, s.id FROM lineage l
|
|
177
|
+
JOIN sessions parent ON parent.id=l.id AND parent.end_reason='compression'
|
|
178
|
+
JOIN sessions s ON s.parent_session_id=l.id
|
|
179
|
+
) SELECT DISTINCT c.delegation_id, c.origin_ui_session_id, c.event_json
|
|
180
|
+
FROM candidates c JOIN lineage l ON l.delegation_id=c.delegation_id
|
|
181
|
+
JOIN messages m ON m.session_id=l.id
|
|
182
|
+
WHERE m.role='user' AND m.display_kind='async_delegation_complete'
|
|
183
|
+
AND json_valid(m.display_metadata)
|
|
184
|
+
AND json_extract(m.display_metadata, '$.delegation_id')=c.delegation_id
|
|
185
|
+
AND coalesce(json_extract(m.display_metadata, '$.delivery_notice'), '')=''
|
|
186
|
+
AND coalesce(json_extract(m.display_metadata, '$.presentation_suppressed'), 0)=0
|
|
187
|
+
ORDER BY c.delegation_id LIMIT ?""", (time.time() - 48 * 3600, delegation_id, delegation_id, after, _DELIVERY_RECONCILE_PAGE_SIZE)).fetchall()
|
|
188
|
+
events = []
|
|
189
|
+
for did, owner, payload in rows:
|
|
190
|
+
event = _json(payload)
|
|
191
|
+
if event.get("type") != "async_delegation" or event.get("delegation_id") != did or event.get("origin_ui_session_id") != owner or event.get("task_failure_notice"):
|
|
192
|
+
continue
|
|
193
|
+
events.append({**event, "reconciliation_profile_home": str(home.resolve())})
|
|
194
|
+
return events, rows[-1][0] if len(rows) == _DELIVERY_RECONCILE_PAGE_SIZE else ""
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _reconcile_delivered_notifications() -> list[dict]:
|
|
198
|
+
out = []
|
|
199
|
+
for home in _completion_homes():
|
|
200
|
+
now = time.monotonic()
|
|
201
|
+
if now - _LAST_DELIVERY_RECONCILE.get(home, -float("inf")) < _DELIVERY_RECONCILE_INTERVAL_S:
|
|
202
|
+
continue
|
|
203
|
+
try:
|
|
204
|
+
events, cursor = _delivered_notifications(home, after=_DELIVERY_RECONCILE_CURSOR.get(home, ""))
|
|
205
|
+
out.extend(events)
|
|
206
|
+
_DELIVERY_RECONCILE_CURSOR[home] = cursor
|
|
207
|
+
_LAST_DELIVERY_RECONCILE[home] = now
|
|
208
|
+
except Exception: # retry unreadable homes; never block live queue delivery
|
|
209
|
+
log.warning("Failed to reconcile typed delegation deliveries for %s", home, exc_info=True)
|
|
210
|
+
return out
|
|
211
|
+
|
|
212
|
+
|
|
105
213
|
def drain(max_events: int) -> list[dict]:
|
|
106
214
|
"""Pop every queued completion event; the server requeues what it does not own."""
|
|
107
215
|
registry = _registry()
|
|
108
216
|
completion_queue = getattr(registry, "completion_queue", None) if registry is not None else None
|
|
109
217
|
if completion_queue is None:
|
|
110
218
|
return []
|
|
219
|
+
try:
|
|
220
|
+
_restore_and_sweep_completions(registry)
|
|
221
|
+
except Exception: # noqa: BLE001 - maintenance must not prevent delivery of live queued events
|
|
222
|
+
log.debug("Failed to reconcile delegation completions", exc_info=True)
|
|
111
223
|
try:
|
|
112
224
|
# A recovered process has no reader thread; only this probe notices its exit and queues its completion (TAL-533).
|
|
113
225
|
with registry._lock:
|
|
@@ -117,6 +229,12 @@ def drain(max_events: int) -> list[dict]:
|
|
|
117
229
|
_publish_recovered_exits(registry)
|
|
118
230
|
except Exception: # noqa: BLE001
|
|
119
231
|
log.debug("Failed to reconcile recovered processes", exc_info=True)
|
|
232
|
+
# Use the existing queue and its bound, so reconciliation cannot starve live or foreign events.
|
|
233
|
+
try:
|
|
234
|
+
for event in _reconcile_delivered_notifications():
|
|
235
|
+
completion_queue.put_nowait(event)
|
|
236
|
+
except Exception:
|
|
237
|
+
log.warning("Failed to offer typed delegation deliveries", exc_info=True)
|
|
120
238
|
out = []
|
|
121
239
|
while len(out) < max_events:
|
|
122
240
|
try:
|
|
@@ -138,7 +256,7 @@ def requeue(events: list[dict]) -> int:
|
|
|
138
256
|
count = 0
|
|
139
257
|
for evt in events:
|
|
140
258
|
try:
|
|
141
|
-
completion_queue.put_nowait({k: v for k, v in evt.items() if k not in ("process_id", "consumed")})
|
|
259
|
+
completion_queue.put_nowait({k: v for k, v in evt.items() if k not in ("process_id", "consumed", "child_process")})
|
|
142
260
|
count += 1
|
|
143
261
|
except Exception: # noqa: BLE001
|
|
144
262
|
log.debug("Failed to requeue process completion", exc_info=True)
|
|
@@ -196,6 +314,15 @@ def claim_delivery(evt: dict, consumer: str) -> str | None:
|
|
|
196
314
|
if api is None:
|
|
197
315
|
return ""
|
|
198
316
|
claim_id = api.claim_event_delivery(_ledger_event(evt), consumer)
|
|
317
|
+
if claim_id is None and consumer == "webui" and evt.get("origin_ui_session_id"):
|
|
318
|
+
from hermes_constants import get_hermes_home
|
|
319
|
+
home = Path(get_hermes_home()).resolve()
|
|
320
|
+
if evt.get("reconciliation_profile_home", str(home)) == str(home):
|
|
321
|
+
# A live queue copy can race the transcript-only consumer too. Recheck the same proof here.
|
|
322
|
+
transport = {"process_id", "consumed", "child_process", "restored", "reconciliation_profile_home"}
|
|
323
|
+
for candidate in _delivered_notifications(home, str(evt.get("delegation_id") or ""))[0]:
|
|
324
|
+
if {k: v for k, v in candidate.items() if k not in transport} == {k: v for k, v in evt.items() if k not in transport}:
|
|
325
|
+
return "" # Web's session receipt acknowledges this admission, not the Agent ledger.
|
|
199
326
|
return None if claim_id is None else str(claim_id)
|
|
200
327
|
|
|
201
328
|
|
|
@@ -230,11 +357,14 @@ def defer_delivery(evt: dict, claim_id: str) -> bool:
|
|
|
230
357
|
|
|
231
358
|
|
|
232
359
|
def format_notification(evt: dict) -> str:
|
|
233
|
-
if evt.get("type")
|
|
360
|
+
if evt.get("type") in ("async_delegation", "heartbeat", "watch_match", "watch_disabled", "watch_overflow_tripped", "watch_overflow_released"):
|
|
234
361
|
try:
|
|
235
|
-
from tools
|
|
362
|
+
from tools import process_registry
|
|
236
363
|
|
|
237
|
-
|
|
364
|
+
# Older formatters fall through unknown events to an exit notification.
|
|
365
|
+
if evt.get("type") == "heartbeat" and not callable(getattr(getattr(process_registry, "ProcessRegistry", None), "_emit_heartbeat", None)):
|
|
366
|
+
return ""
|
|
367
|
+
return process_registry.format_process_notification(evt) or ""
|
|
238
368
|
except Exception: # noqa: BLE001
|
|
239
369
|
return ""
|
|
240
370
|
if evt.get("type") != "completion":
|
|
@@ -404,12 +534,21 @@ def _goal_text(content) -> str:
|
|
|
404
534
|
return ""
|
|
405
535
|
if content.startswith(_CONTENT_JSON_PREFIX):
|
|
406
536
|
try:
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
537
|
+
from hermes_state import SessionDB
|
|
538
|
+
decode = getattr(SessionDB, "_decode_content", None)
|
|
539
|
+
except ImportError:
|
|
540
|
+
decode = None
|
|
541
|
+
if callable(decode):
|
|
542
|
+
content = decode(content)
|
|
543
|
+
else:
|
|
544
|
+
try:
|
|
545
|
+
content = json.loads(content[len(_CONTENT_JSON_PREFIX):])
|
|
546
|
+
except ValueError:
|
|
547
|
+
pass # Legacy malformed marker rows remain literal text, as in the Agent.
|
|
548
|
+
if isinstance(content, list):
|
|
549
|
+
texts = [p.get("text") for p in content if isinstance(p, dict) and p.get("type") == "text"]
|
|
411
550
|
return str(texts[0]) if texts and texts[0] else ""
|
|
412
|
-
return content.split(_IMAGE_HINTS, 1)[0]
|
|
551
|
+
return content.split(_IMAGE_HINTS, 1)[0] if isinstance(content, str) else ""
|
|
413
552
|
|
|
414
553
|
|
|
415
554
|
def unit_children(unit: dict, owner: str, live: list[dict], finished: list[dict], now: float) -> list[dict]:
|
|
@@ -472,6 +611,8 @@ def recover(base_home: Path) -> int:
|
|
|
472
611
|
recovery fails the call, so the server retries."""
|
|
473
612
|
from .profiles import named_profile_homes
|
|
474
613
|
|
|
614
|
+
global _COMPLETION_BASE_HOME
|
|
615
|
+
_COMPLETION_BASE_HOME = base_home
|
|
475
616
|
named = [home for _, home in named_profile_homes(base_home)]
|
|
476
617
|
failed = []
|
|
477
618
|
for home in [base_home, *named]:
|
|
@@ -533,7 +674,15 @@ def register(registry_) -> None:
|
|
|
533
674
|
if not consumer:
|
|
534
675
|
raise InvalidParams("consumer is required")
|
|
535
676
|
with scoped_home(profile_home_param(params)):
|
|
536
|
-
|
|
677
|
+
claim = claim_delivery(evt, consumer)
|
|
678
|
+
result = {"claim_id": claim}
|
|
679
|
+
if claim is None:
|
|
680
|
+
api = _delivery_api()
|
|
681
|
+
lookup = getattr(api, "get_durable_delegation", None)
|
|
682
|
+
row = lookup(str(evt.get("delegation_id") or "")) if callable(lookup) else None
|
|
683
|
+
if row and row.get("delivery_state") == "pending":
|
|
684
|
+
result["retryable"] = True
|
|
685
|
+
return result
|
|
537
686
|
|
|
538
687
|
@registry_.method("process.complete_delivery")
|
|
539
688
|
def complete_(ctx: CallContext, params: dict) -> dict:
|
|
@@ -151,20 +151,58 @@ def canonical_bot_chat(home: Path) -> dict | None:
|
|
|
151
151
|
pass
|
|
152
152
|
|
|
153
153
|
|
|
154
|
+
GATEWAY_RUNNING_MODES = ("own", "served")
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def gateway_mode(home: Path, name: str, is_default: bool) -> str:
|
|
158
|
+
"""The profile's gateway under the host multiplexer (TAL-805): ``served`` by the live host gateway, ``own`` gateway
|
|
159
|
+
process, ``parked`` (``hermes -p X gateway stop`` left its marker and nothing runs; the marker records intent, so a
|
|
160
|
+
live ``--force`` gateway still counts, as in ``hermes -p X gateway status``), ``standalone`` (opted out of the host and
|
|
161
|
+
not running), else ``stopped``. The default profile is the host itself.
|
|
162
|
+
A helper the installed Agent lacks answers no, so an Agent without the multiplexer helpers reports ``own`` or
|
|
163
|
+
``stopped``; a helper that fails answers no too, except the parked check, which fails closed to ``stopped``."""
|
|
164
|
+
from hermes_cli import profiles as agent
|
|
165
|
+
|
|
166
|
+
def probe(helper: str, arg) -> bool | None:
|
|
167
|
+
check = getattr(agent, helper, None)
|
|
168
|
+
if check is None:
|
|
169
|
+
return False
|
|
170
|
+
try:
|
|
171
|
+
return bool(check(arg))
|
|
172
|
+
except Exception: # noqa: BLE001
|
|
173
|
+
log.debug("gateway mode probe %s failed for %s", helper, home, exc_info=True)
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
def asks(helper: str, arg) -> bool:
|
|
177
|
+
return probe(helper, arg) is True
|
|
178
|
+
|
|
179
|
+
named = not is_default
|
|
180
|
+
parked = probe("profile_is_parked", home) if named else False
|
|
181
|
+
if parked is None:
|
|
182
|
+
return "stopped"
|
|
183
|
+
if named and asks("_served_by_running_multiplexer", name):
|
|
184
|
+
return "served"
|
|
185
|
+
if asks("_check_gateway_running", home):
|
|
186
|
+
return "own"
|
|
187
|
+
if parked:
|
|
188
|
+
return "parked"
|
|
189
|
+
if named and asks("profile_is_standalone", home):
|
|
190
|
+
return "standalone"
|
|
191
|
+
return "stopped"
|
|
192
|
+
|
|
193
|
+
|
|
154
194
|
def _row(home: Path, name: str, is_default: bool) -> dict:
|
|
155
|
-
from hermes_cli.profiles import
|
|
195
|
+
from hermes_cli.profiles import _read_config_model
|
|
156
196
|
|
|
157
197
|
try:
|
|
158
198
|
model, provider = _read_config_model(home)
|
|
159
199
|
except Exception: # noqa: BLE001
|
|
160
200
|
model, provider = None, None
|
|
161
|
-
|
|
162
|
-
gateway_running = bool(_check_gateway_running(home))
|
|
163
|
-
except Exception: # noqa: BLE001
|
|
164
|
-
gateway_running = False
|
|
201
|
+
mode = gateway_mode(home, name, is_default)
|
|
165
202
|
enabled, total = skills_stats(home)
|
|
166
203
|
return {
|
|
167
|
-
"name": name, "path": str(home), "is_default": is_default, "gateway_running":
|
|
204
|
+
"name": name, "path": str(home), "is_default": is_default, "gateway_running": mode in GATEWAY_RUNNING_MODES, "gateway_mode": mode,
|
|
205
|
+
"model": model, "provider": provider,
|
|
168
206
|
"has_env": (home / ".env").exists(), "visible": _visible(home), "skill_count": enabled, "enabled_skills": enabled, "total_skills": total,
|
|
169
207
|
**bot_identity(home), "canonical_session": canonical_bot_chat(home),
|
|
170
208
|
}
|