@maudecode/talaria-web 1.17.2 → 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.d.ts +1 -1
- package/dist/api/auth-raw.js +20 -20
- package/dist/api/auth-raw.js.map +1 -1
- package/dist/api/automation-raw.d.ts +7 -1
- package/dist/api/automation-raw.js +74 -27
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +128 -23
- package/dist/api/automation-router.js +29 -13
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +1845 -40
- package/dist/api/chat-router.js +196 -114
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +37 -3
- package/dist/api/git-router.js +47 -48
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.d.ts +9 -1
- package/dist/api/raw-routes.js +286 -73
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +16 -6
- package/dist/api/router.js +28 -26
- 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 +3312 -131
- package/dist/api/sessions-router.js +287 -157
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +457 -8
- package/dist/api/settings-router.js +54 -33
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.d.ts +7 -2
- package/dist/api/sse-routes.js +109 -62
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +63 -55
- package/dist/api/tools-raw.js.map +1 -1
- package/dist/api/tools-router.d.ts +998 -85
- package/dist/api/tools-router.js +447 -61
- 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 +98 -59
- package/dist/app.js.map +1 -1
- package/dist/auth/gate.js +15 -11
- package/dist/auth/gate.js.map +1 -1
- package/dist/auth/oidc.d.ts +5 -2
- package/dist/auth/oidc.js +8 -7
- package/dist/auth/oidc.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 +15 -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 +116 -60
- package/dist/config/agent-config.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +19 -6
- 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 +31 -12
- package/dist/http/context.js +60 -24
- package/dist/http/context.js.map +1 -1
- package/dist/http/csp.d.ts +2 -1
- package/dist/http/csp.js +3 -2
- package/dist/http/csp.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 +20 -4
- package/dist/profiles/profiles.js +115 -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 +84 -14
- package/dist/providers/catalog.js +474 -151
- 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/raster-image.d.ts +7 -0
- package/dist/raster-image.js +267 -0
- package/dist/raster-image.js.map +1 -0
- package/dist/redact.js +342 -46
- 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 +305 -96
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +15 -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 -27
- package/dist/sessions/background-tasks.js +89 -97
- 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 +27 -6
- package/dist/sessions/cli-sessions.js +152 -42
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +77 -9
- package/dist/sessions/completions.js +482 -45
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/compress.d.ts +8 -0
- package/dist/sessions/compress.js +2 -2
- package/dist/sessions/compress.js.map +1 -1
- package/dist/sessions/drafts.d.ts +14 -10
- package/dist/sessions/drafts.js +38 -43
- package/dist/sessions/drafts.js.map +1 -1
- package/dist/sessions/export.d.ts +5 -0
- package/dist/sessions/export.js +30 -0
- package/dist/sessions/export.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/gateway-watcher.d.ts +7 -3
- package/dist/sessions/gateway-watcher.js +31 -19
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/goals.d.ts +31 -0
- package/dist/sessions/goals.js +75 -0
- package/dist/sessions/goals.js.map +1 -0
- package/dist/sessions/handoff.d.ts +32 -0
- package/dist/sessions/handoff.js +114 -0
- package/dist/sessions/handoff.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 +31 -16
- package/dist/sessions/list.js +139 -129
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +69 -13
- package/dist/sessions/merge.js +265 -64
- 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 +19 -0
- package/dist/sessions/recovery.js +322 -0
- package/dist/sessions/recovery.js.map +1 -0
- package/dist/sessions/relay.d.ts +38 -19
- package/dist/sessions/relay.js +302 -79
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +260 -55
- package/dist/sessions/service.js +1448 -462
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +24 -2
- package/dist/sessions/session.js +69 -7
- 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.d.ts +1 -0
- package/dist/sessions/state-db-worker.js +35 -0
- package/dist/sessions/state-db-worker.js.map +1 -0
- package/dist/sessions/state-db.d.ts +113 -7
- package/dist/sessions/state-db.js +861 -44
- 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 +65 -68
- package/dist/sessions/store.js +305 -602
- 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.d.ts +2 -0
- package/dist/sessions/titles.js +5 -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 +30 -50
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.d.ts +11 -2
- package/dist/sessions/turn-context.js +18 -11
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +122 -17
- package/dist/sessions/turn.js +939 -358
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sessions/wakeup-pause.d.ts +54 -0
- package/dist/sessions/wakeup-pause.js +163 -0
- package/dist/sessions/wakeup-pause.js.map +1 -0
- 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 +178 -184
- 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.d.ts +2 -2
- package/dist/sidecar/fake.js +19 -2
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/startup.d.ts +13 -5
- package/dist/startup.js +48 -0
- package/dist/startup.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/test/ts-worker-hooks.d.ts +1 -0
- package/dist/test/ts-worker-hooks.js +24 -0
- package/dist/test/ts-worker-hooks.js.map +1 -0
- package/dist/text/diff.d.ts +9 -14
- package/dist/text/diff.js +74 -108
- package/dist/text/diff.js.map +1 -1
- 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 +122 -18
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +53 -0
- package/dist/tools/dashboard-plugins.js +188 -0
- package/dist/tools/dashboard-plugins.js.map +1 -0
- package/dist/tools/extensions.d.ts +18 -5
- package/dist/tools/extensions.js +344 -266
- 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 +44 -0
- package/dist/tools/health.js +201 -46
- 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/mcp.d.ts +13 -0
- package/dist/tools/mcp.js +88 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/memory-masks.d.ts +5 -0
- package/dist/tools/memory-masks.js +256 -0
- package/dist/tools/memory-masks.js.map +1 -0
- package/dist/tools/memory.d.ts +29 -3
- package/dist/tools/memory.js +69 -27
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/plugin-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/project-os.d.ts +11 -0
- package/dist/tools/project-os.js +267 -0
- package/dist/tools/project-os.js.map +1 -0
- package/dist/tools/skills.d.ts +14 -5
- package/dist/tools/skills.js +49 -16
- 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 +110 -32
- package/dist/tools/updates.js +1112 -294
- package/dist/tools/updates.js.map +1 -1
- package/dist/tools/wiki.d.ts +68 -0
- package/dist/tools/wiki.js +413 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/util.d.ts +2 -0
- package/dist/util.js +5 -0
- package/dist/util.js.map +1 -1
- package/dist/workspace/escape.d.ts +61 -0
- package/dist/workspace/escape.js +149 -0
- package/dist/workspace/escape.js.map +1 -0
- package/dist/workspace/extract.d.ts +22 -0
- package/dist/workspace/extract.js +308 -0
- package/dist/workspace/extract.js.map +1 -0
- package/dist/workspace/fs.d.ts +12 -0
- package/dist/workspace/fs.js +92 -23
- package/dist/workspace/fs.js.map +1 -1
- package/dist/workspace/git.d.ts +34 -1
- package/dist/workspace/git.js +328 -35
- package/dist/workspace/git.js.map +1 -1
- package/dist/workspace/media.d.ts +16 -13
- package/dist/workspace/media.js +43 -61
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/rollback.d.ts +36 -22
- package/dist/workspace/rollback.js +178 -272
- package/dist/workspace/rollback.js.map +1 -1
- package/dist/workspace/unzip.js +4 -1
- package/dist/workspace/unzip.js.map +1 -1
- package/dist/workspace/upload.d.ts +7 -4
- package/dist/workspace/upload.js +5 -2
- package/dist/workspace/upload.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.d.ts +2 -1
- package/dist/workspace/worktrees.js +179 -42
- package/dist/workspace/worktrees.js.map +1 -1
- package/package.json +7 -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 +32 -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 +56 -3
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +166 -24
- package/sidecar/talaria_sidecar/methods/chat.py +852 -135
- package/sidecar/talaria_sidecar/methods/checkpoints.py +89 -0
- package/sidecar/talaria_sidecar/methods/commands.py +294 -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 +395 -36
- package/sidecar/talaria_sidecar/methods/cron_execution.py +284 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +212 -55
- 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 +108 -34
- package/sidecar/talaria_sidecar/methods/mcp.py +1 -1
- 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 +218 -15
- package/sidecar/talaria_sidecar/methods/profiles.py +121 -13
- package/sidecar/talaria_sidecar/methods/providers.py +217 -28
- 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 +316 -75
- 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 +98 -13
- package/sidecar/talaria_sidecar/speed.py +35 -0
- package/static/dist/FILES.txt +126 -126
- 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-opyh9y0v.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-bfd4h3id.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-b2x1lqot.js → abnfDiagram-VCTEODGH-gjayq3ra.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +1 -0
- package/static/dist/assets/{architectureDiagram-5GKGNRK7-h38o5l7b.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-bqquxv2u.js → blockDiagram-I7D4REHJ-joedghi3.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-f3fb8w6z.js → c4Diagram-7LVT6UL2-hyrjrohe.js} +1 -1
- package/static/dist/assets/channel-es95o4y8.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-bzfyyzp3.js → chunk-4HAMMTFA-koouqbut.js} +1 -1
- package/static/dist/assets/{chunk-75Z2AOVW-ly99rfx5.js → chunk-75Z2AOVW-bl4bhdnt.js} +1 -1
- package/static/dist/assets/{chunk-DU6HZSFF-bg6ecfqf.js → chunk-DU6HZSFF-gpedttsp.js} +3 -3
- package/static/dist/assets/{chunk-F27PBJKO-e8k7mmqw.js → chunk-F27PBJKO-d8xxi0zi.js} +1 -1
- package/static/dist/assets/{chunk-GMAD6QVW-cmalnoaj.js → chunk-GMAD6QVW-jro0hl73.js} +1 -1
- package/static/dist/assets/{chunk-GVQU2GXP-gmif5o01.js → chunk-GVQU2GXP-djn6gbyu.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-f1nwwh6u.js → chunk-IMKFNOWR-vw4p5p7o.js} +1 -1
- package/static/dist/assets/{chunk-L3NEJ4N5-oktfh5v7.js → chunk-L3NEJ4N5-n1hj77q8.js} +1 -1
- package/static/dist/assets/{chunk-OSK3NFVY-b1sdx96z.js → chunk-OSK3NFVY-oy0gwn2n.js} +1 -1
- package/static/dist/assets/{chunk-P2QGCYS3-fhu4nzxt.js → chunk-P2QGCYS3-onf1hz6c.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-em31rnef.js → chunk-POPQ4Y6H-m8sqn7cs.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-bxhhyftw.js → chunk-PWAF6VOD-ek4smc8x.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-fmrvwcav.js → chunk-SHT3W25Y-g9gfvefo.js} +3 -3
- package/static/dist/assets/{chunk-SVP7TREG-lymukl2j.js → chunk-SVP7TREG-f9nfv2cu.js} +1 -1
- package/static/dist/assets/{chunk-TICWLB2K-lmza6k23.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-fw5b1pc6.js → copy-jamtd1pf.js} +1 -1
- package/static/dist/assets/{cynefin-OW5HDTMX-czlhbyhs.js → cynefin-OW5HDTMX-f8xfdd3f.js} +1 -1
- package/static/dist/assets/{cynefinDiagram-5FMLGOSQ-gq7mvswb.js → cynefinDiagram-5FMLGOSQ-n9lb99h9.js} +1 -1
- package/static/dist/assets/{dagre-GXQ25YYZ-cqdbf7dr.js → dagre-GXQ25YYZ-dgailddi.js} +4 -4
- package/static/dist/assets/{diagram-S7CK7UJ4-o6arxa58.js → diagram-S7CK7UJ4-m6aeoe7c.js} +1 -1
- package/static/dist/assets/{diagram-UQ7AKVKN-nhnd68tz.js → diagram-UQ7AKVKN-jall3j0x.js} +1 -1
- package/static/dist/assets/{diagram-VSXAHHWV-dk2sclzn.js → diagram-VSXAHHWV-hbawi7hn.js} +1 -1
- package/static/dist/assets/{diagram-VX7I27RA-n3k5nyx3.js → diagram-VX7I27RA-hendl2tt.js} +1 -1
- package/static/dist/assets/{diagram-Z3DM3KII-m6q9cwdh.js → diagram-Z3DM3KII-igwc35p3.js} +1 -1
- package/static/dist/assets/{ebnfDiagram-PWID7BFC-lsa5641p.js → ebnfDiagram-PWID7BFC-c64knz08.js} +1 -1
- package/static/dist/assets/{erDiagram-RLTQ6QDP-fo2ckbe6.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-nzqz6x9g.js → ganttDiagram-EL5Y4UJY-ma6jxj5i.js} +1 -1
- package/static/dist/assets/{gitGraph-4MIJSDKK-gukvcxe6.js → gitGraph-4MIJSDKK-naa9w6xa.js} +1 -1
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-lqhdp8f0.js → gitGraphDiagram-WWUBYQGX-hzltvsod.js} +1 -1
- package/static/dist/assets/{highlighted-body-KPVGNVTW-igw6cp39.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-gvu7a93l.js → info-A6RAGUB7-mn2ut5ko.js} +1 -1
- package/static/dist/assets/{infoDiagram-27XIBGKW-m8t8g6w1.js → infoDiagram-27XIBGKW-h6kuqvsb.js} +1 -1
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-l07vkbgj.js → ishikawaDiagram-5VMMS53U-e7bnwq7h.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-hybkgj8l.js → journeyDiagram-3NMN7TZE-etd1bi6p.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-by13uvtn.js → kanban-definition-UXKFOSKX-emb1g9dz.js} +4 -4
- package/static/dist/assets/lazyRouteComponent-o816ytzl.js +1 -0
- package/static/dist/assets/{line-osxq6fq7.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-i91oxmou.js → mermaid-parser.core-bnre27u8.js} +3 -3
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-m82mx8ww.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-nbtgge2o.js → packet-AYTQ26CC-hatq7m2e.js} +1 -1
- package/static/dist/assets/pcmTap.worklet-74EKjWAZ.js +1 -0
- package/static/dist/assets/{pegDiagram-XKGWAZYB-f1zxzga1.js → pegDiagram-XKGWAZYB-gwisz8jv.js} +1 -1
- package/static/dist/assets/{pie-WAS4IAKB-of8vuhxs.js → pie-WAS4IAKB-fpftf0mk.js} +1 -1
- package/static/dist/assets/{pieDiagram-E7YTZNPT-o7y8ftio.js → pieDiagram-E7YTZNPT-khm1o9a6.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-iqiwia1t.js → quadrantDiagram-AXDQQJYC-owqc4uqn.js} +1 -1
- package/static/dist/assets/{radar-RG4KPBEZ-delnsy2v.js → radar-RG4KPBEZ-cntfwjpq.js} +1 -1
- package/static/dist/assets/{railroad-74A4TZTK-nspnyq9u.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-z41tqx5z.js → railroadDiagram-O6MQD6OU-etuh0qa0.js} +1 -1
- package/static/dist/assets/{refresh-cw-nt1dtsx4.js → refresh-cw-mqbkv2a3.js} +1 -1
- package/static/dist/assets/refresh-l29ljp76.js +1 -0
- package/static/dist/assets/{requirementDiagram-BXWQKSXE-bdvif194.js → requirementDiagram-BXWQKSXE-oq2ulk22.js} +1 -1
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-h73e0rol.js → sankeyDiagram-P5KCCOFB-iqc02emv.js} +1 -1
- package/static/dist/assets/saved-ndd4t2xb.js +1 -0
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-iv95mb1z.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-k417ixmf.js → stateDiagram-D77RDMKH-dnpt1ato.js} +1 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +1 -0
- package/static/dist/assets/{swimlanes-42K2YHIH-esola70w.js → swimlanes-42K2YHIH-loqbdazb.js} +1 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +8 -0
- package/static/dist/assets/{timeline-definition-24CTP7MA-getrz2y8.js → timeline-definition-24CTP7MA-ol2hnvma.js} +1 -1
- package/static/dist/assets/toast-i3h34v6o.js +64 -0
- package/static/dist/assets/{treeView-Q6P3EWNA-hc7ap1q7.js → treeView-Q6P3EWNA-idrj6iox.js} +1 -1
- package/static/dist/assets/{treemap-WGGIJYW6-b7k1syy5.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-lhg566ew.js → useParams-gjc70qru.js} +1 -1
- package/static/dist/assets/{useSearch-lbrh6ejn.js → useSearch-e6ae539u.js} +1 -1
- package/static/dist/assets/{vennDiagram-4TSXK5OY-n6pcy5qb.js → vennDiagram-4TSXK5OY-bvwr9o2z.js} +1 -1
- package/static/dist/assets/{wardley-WFR3VGLG-lpa18vz1.js → wardley-WFR3VGLG-31ui8tma.js} +1 -1
- package/static/dist/assets/{wardleyDiagram-VM6X3IG4-kpclwwg7.js → wardleyDiagram-VM6X3IG4-k5wqtx4b.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-paa2n8y0.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-fb2td9zi.js +0 -1
- package/static/dist/assets/ChatPage-cj96kiy9.js +0 -25
- package/static/dist/assets/Dialog-kxcg7ard.js +0 -1
- package/static/dist/assets/ExtensionRoute-jf7h0754.js +0 -1
- package/static/dist/assets/HubRoute-gmanpd5y.js +0 -2
- package/static/dist/assets/Markdown-mdwlvj3w.js +0 -598
- package/static/dist/assets/RightPanel-ftvrjlcp.js +0 -1
- package/static/dist/assets/Select-bilaypej.js +0 -1
- package/static/dist/assets/SessionListPanel-og8n36qs.js +0 -1
- package/static/dist/assets/SettingsLayout-jonjefmj.js +0 -1
- package/static/dist/assets/States-nmejrwrm.js +0 -1
- package/static/dist/assets/Toaster-nnl8zkt9.js +0 -1
- package/static/dist/assets/_app-gdidzd94.js +0 -1
- package/static/dist/assets/_app.index-hbarzbjx.js +0 -1
- package/static/dist/assets/_app.insights-luywlarz.js +0 -1
- package/static/dist/assets/_app.kanban-kincnbr8.js +0 -1
- package/static/dist/assets/_app.logs-oi2gr3gs.js +0 -1
- package/static/dist/assets/_app.memory-b6jfivt6.js +0 -1
- package/static/dist/assets/_app.profiles-lpvixmqp.js +0 -1
- package/static/dist/assets/_app.settings-vowx3iq0.js +0 -1
- package/static/dist/assets/_app.settings._section-cnntg1tu.js +0 -3
- package/static/dist/assets/_app.skills-fb57lpau.js +0 -1
- package/static/dist/assets/_app.tasks-eszpx1q7.js +0 -2
- package/static/dist/assets/_app.todos-nr05ac6w.js +0 -1
- package/static/dist/assets/_app.workspaces-d2luomu6.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-hd0o7bde.js +0 -1
- package/static/dist/assets/back-bemaer09.js +0 -1
- package/static/dist/assets/cancel-drd0g6d9.js +0 -1
- package/static/dist/assets/channel-cpdgf867.js +0 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-ko09sguk.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-ko09sguk.js +0 -1
- package/static/dist/assets/copied-ima3pysb.js +0 -1
- package/static/dist/assets/endpoints-d33siokx.js +0 -64
- package/static/dist/assets/eventmodeling-NTZA5JFV-emctlo64.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-bfi3moqa.js +0 -1
- package/static/dist/assets/index-cxq58xb1.js +0 -11
- package/static/dist/assets/index-hgtx08n5.css +0 -2
- package/static/dist/assets/lazyRouteComponent-af0lvgjx.js +0 -1
- package/static/dist/assets/link-jyxicdhg.js +0 -1
- package/static/dist/assets/login-ec21t39x.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-gfl8z3ep.js +0 -1
- package/static/dist/assets/onboarding-btnltvyz.js +0 -1
- package/static/dist/assets/onboarding_model_label-dp7xffoh.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-nst1qxyn.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-ci37x8qy.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-aimkk07z.js +0 -1
- package/static/dist/assets/refresh-b4uams1i.js +0 -1
- package/static/dist/assets/saved-kg52csy7.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-ej0iapxe.js +0 -1
- package/static/dist/assets/share._token-f97e94r0.js +0 -2
- package/static/dist/assets/sliders-horizontal-fj18it47.js +0 -1
- package/static/dist/assets/sse-fwpqtzbg.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-hwn4apct.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-d1h97oyg.js +0 -8
- package/static/dist/assets/todoStore-eginf9h4.js +0 -1
- package/static/dist/assets/tts-lxdxnmjd.js +0 -1
- package/static/dist/assets/untitled-ovpfthg4.js +0 -1
- package/static/dist/assets/useForm-bcblv1rx.js +0 -1
- package/static/dist/assets/useLocale-fi5jb8ma.js +0 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""Own an Agent sync process tree until completion or the sidecar's stdin pipe closes.
|
|
2
|
+
|
|
3
|
+
This small supervisor survives a killed sidecar long enough to stop and reap the
|
|
4
|
+
writer. Its OS lock prevents a replacement sidecar from starting another writer
|
|
5
|
+
before that cleanup finishes. Only stdlib imports, even with broken Agent deps.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import signal
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
import threading
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _lock(file) -> None:
|
|
19
|
+
if os.name == "nt":
|
|
20
|
+
import msvcrt
|
|
21
|
+
file.seek(0)
|
|
22
|
+
if not file.read(1):
|
|
23
|
+
file.write(b"0")
|
|
24
|
+
file.flush()
|
|
25
|
+
file.seek(0)
|
|
26
|
+
msvcrt.locking(file.fileno(), msvcrt.LK_NBLCK, 1)
|
|
27
|
+
else:
|
|
28
|
+
import fcntl
|
|
29
|
+
fcntl.flock(file.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _stop_tree(child: subprocess.Popen) -> None:
|
|
33
|
+
if os.name == "nt":
|
|
34
|
+
# taskkill is part of Windows and terminates the descendants as well.
|
|
35
|
+
subprocess.run(["taskkill", "/PID", str(child.pid), "/T", "/F"],
|
|
36
|
+
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=False)
|
|
37
|
+
else:
|
|
38
|
+
try:
|
|
39
|
+
os.killpg(child.pid, signal.SIGKILL)
|
|
40
|
+
except ProcessLookupError:
|
|
41
|
+
pass
|
|
42
|
+
child.wait()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def main() -> int:
|
|
46
|
+
root = Path(sys.argv[1]).resolve()
|
|
47
|
+
stopped = threading.Event()
|
|
48
|
+
for sig in (signal.SIGINT, signal.SIGTERM):
|
|
49
|
+
signal.signal(sig, lambda *_: stopped.set())
|
|
50
|
+
|
|
51
|
+
def owner_exited() -> None:
|
|
52
|
+
try:
|
|
53
|
+
os.read(0, 1)
|
|
54
|
+
finally:
|
|
55
|
+
stopped.set()
|
|
56
|
+
|
|
57
|
+
threading.Thread(target=owner_exited, daemon=True).start()
|
|
58
|
+
lock_path = Path(os.environ["HERMES_HOME"]) / ".talaria-agent-sync" / hashlib.sha256(os.fsencode(root)).hexdigest()
|
|
59
|
+
lock_path.parent.mkdir(parents=True, exist_ok=True)
|
|
60
|
+
with lock_path.open("a+b") as lease:
|
|
61
|
+
try:
|
|
62
|
+
_lock(lease)
|
|
63
|
+
except OSError:
|
|
64
|
+
print("Another Agent dependency sync is still running.", file=sys.stderr)
|
|
65
|
+
return 1
|
|
66
|
+
if stopped.is_set():
|
|
67
|
+
return 1
|
|
68
|
+
child = subprocess.Popen(
|
|
69
|
+
[sys.executable, "-m", "hermes_cli.venv_sync", "--project-root", str(root), "--json"],
|
|
70
|
+
cwd=root, stdin=subprocess.DEVNULL, start_new_session=os.name != "nt",
|
|
71
|
+
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0,
|
|
72
|
+
)
|
|
73
|
+
try:
|
|
74
|
+
while child.poll() is None:
|
|
75
|
+
if stopped.wait(0.05):
|
|
76
|
+
_stop_tree(child)
|
|
77
|
+
return 1
|
|
78
|
+
return child.returncode
|
|
79
|
+
finally:
|
|
80
|
+
if child.poll() is None:
|
|
81
|
+
_stop_tree(child)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
if __name__ == "__main__":
|
|
85
|
+
raise SystemExit(main())
|
|
@@ -42,7 +42,22 @@ _RECOVERED_HOMES: set[str] = set()
|
|
|
42
42
|
_RECOVERY_WARNED: set[str] = set()
|
|
43
43
|
_LAUNCH_ENV_LOCK = threading.Lock()
|
|
44
44
|
_LAUNCH_ENV: dict[str, str] | None = None
|
|
45
|
-
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _process_home() -> Path:
|
|
48
|
+
explicit = os.environ.get("HERMES_HOME", "")
|
|
49
|
+
if explicit:
|
|
50
|
+
return Path(explicit).expanduser()
|
|
51
|
+
# Match Agent's literal suffix without importing Agent during sidecar startup.
|
|
52
|
+
suffix = os.environ.get("HERMES_DATA_DIR_SUFFIX", "")
|
|
53
|
+
if sys.platform == "win32":
|
|
54
|
+
local_appdata = os.environ.get("LOCALAPPDATA", "").strip()
|
|
55
|
+
base = Path(local_appdata) if local_appdata else Path.home() / "AppData" / "Local"
|
|
56
|
+
return base / ("hermes" + suffix)
|
|
57
|
+
return Path.home() / (".hermes" + suffix)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
_PROCESS_HOME = _process_home()
|
|
46
61
|
|
|
47
62
|
|
|
48
63
|
def _is_named_profile(home: Path) -> bool:
|
|
@@ -87,6 +102,11 @@ def _activate_multi_profile_hosting() -> None:
|
|
|
87
102
|
set_multiplex_active(True)
|
|
88
103
|
|
|
89
104
|
|
|
105
|
+
def _launch_terminal_env() -> dict[str, str]:
|
|
106
|
+
"""Agent 0.21.3 twin of ``tui_gateway.launch_profile_policy.launch_terminal_env``."""
|
|
107
|
+
return {k: v for k, v in _frozen_launch_env().items() if k.startswith("TERMINAL_")}
|
|
108
|
+
|
|
109
|
+
|
|
90
110
|
def _launch_secret_scope(home: Path) -> dict[str, str]:
|
|
91
111
|
"""Agent 0.21.3 twin of ``tui_gateway.launch_profile_policy.launch_secret_scope``."""
|
|
92
112
|
from agent.secret_scope import _is_global_env, build_profile_secret_scope, is_multiplex_active
|
|
@@ -120,6 +140,13 @@ def _secret_scope(home: Path):
|
|
|
120
140
|
return
|
|
121
141
|
if named:
|
|
122
142
|
activate_multi_profile_hosting()
|
|
143
|
+
# Plugin managers are per home: load this profile's plugins so the secret sources they register exist.
|
|
144
|
+
try:
|
|
145
|
+
from hermes_cli.plugins import discover_plugins
|
|
146
|
+
|
|
147
|
+
discover_plugins()
|
|
148
|
+
except Exception: # noqa: BLE001 - a broken plugin must not block the call, as in the Agent's own discovery
|
|
149
|
+
log.debug("Plugin discovery failed for %s", home, exc_info=True)
|
|
123
150
|
hydrate_profile_secret_sources(home)
|
|
124
151
|
secrets = build_profile_secret_scope(home)
|
|
125
152
|
else:
|
|
@@ -150,10 +177,13 @@ def _terminal_scope(home: Path):
|
|
|
150
177
|
else:
|
|
151
178
|
try:
|
|
152
179
|
from agent.secret_scope import is_multiplex_active
|
|
153
|
-
|
|
154
|
-
except ImportError: # Agent 0.21.3 cannot layer the launch env, so the launch profile keeps the process env
|
|
180
|
+
except ImportError: # An Agent without multiplexing cannot layer the launch env, so the launch profile keeps the process env
|
|
155
181
|
yield
|
|
156
182
|
return
|
|
183
|
+
try:
|
|
184
|
+
from tui_gateway.launch_profile_policy import launch_terminal_env
|
|
185
|
+
except ImportError: # Agent 0.21.3: the sidecar's twin of the launch-profile policy
|
|
186
|
+
launch_terminal_env = _launch_terminal_env
|
|
157
187
|
# Like the launch secret scope: the live process env until multiplexing freezes it.
|
|
158
188
|
launch = launch_terminal_env() if is_multiplex_active() else {k: v for k, v in os.environ.items() if k.startswith("TERMINAL_")}
|
|
159
189
|
token = install_profile_terminal_scope(home, env_overlay=launch)
|
|
@@ -190,6 +220,9 @@ def _recover_processes(home: Path) -> None:
|
|
|
190
220
|
if checkpoint.exists() and not isinstance(json.loads(checkpoint.read_text(encoding="utf-8")), list):
|
|
191
221
|
raise ValueError(f"{checkpoint} is not a list")
|
|
192
222
|
recovered = registry_module.process_registry.recover_from_checkpoint()
|
|
223
|
+
from .methods.process import track_recovered
|
|
224
|
+
|
|
225
|
+
track_recovered(registry_module.process_registry)
|
|
193
226
|
except Exception as exc: # noqa: BLE001
|
|
194
227
|
# Retried on every call in the home; reported once per home so a lasting failure does not flood the log.
|
|
195
228
|
log.log(logging.DEBUG if key in _RECOVERY_WARNED else logging.WARNING, "Background process recovery failed for %s", home, exc_info=True)
|
|
@@ -229,3 +262,23 @@ def scoped_home(home: Path):
|
|
|
229
262
|
os.environ.pop("HERMES_HOME", None)
|
|
230
263
|
else:
|
|
231
264
|
os.environ["HERMES_HOME"] = previous
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@contextlib.contextmanager
|
|
268
|
+
def session_workspace(workspace: str | None):
|
|
269
|
+
"""Bind the session's declared workspace (the Agent's ``_SESSION_CWD``), so terminals, AGENTS.md discovery and goal
|
|
270
|
+
gates run there instead of the sidecar's launch directory. No workspace keeps the Agent's own resolution. A context
|
|
271
|
+
variable, so concurrent calls never share it; a missing Agent surface is logged, not fatal."""
|
|
272
|
+
try:
|
|
273
|
+
from agent.runtime_cwd import _SESSION_CWD
|
|
274
|
+
except Exception: # noqa: BLE001
|
|
275
|
+
log.debug("session cwd bind unavailable", exc_info=True)
|
|
276
|
+
_SESSION_CWD = None
|
|
277
|
+
if not workspace or _SESSION_CWD is None:
|
|
278
|
+
yield
|
|
279
|
+
return
|
|
280
|
+
token = _SESSION_CWD.set(str(workspace))
|
|
281
|
+
try:
|
|
282
|
+
yield
|
|
283
|
+
finally:
|
|
284
|
+
_SESSION_CWD.reset(token)
|
|
@@ -29,9 +29,9 @@ class Registry:
|
|
|
29
29
|
|
|
30
30
|
def build_methods(runtime: AgentRuntime) -> dict[str, Handler]:
|
|
31
31
|
registry = Registry(runtime)
|
|
32
|
-
from . import aux, chat, commands, config, cron, gateway, goals, kanban, mcp, oauth, process, profiles, providers, skills, state_db, stt, text, usage, worktree # noqa: WPS433
|
|
32
|
+
from . import aux, chat, checkpoints, commands, config, connectors, cron, gateway, goals, kanban, mcp, memory, oauth, process, profiles, providers, skills, state_db, stt, text, toolsets, usage, worktree, write_approval # noqa: WPS433
|
|
33
33
|
from . import runtime as runtime_methods
|
|
34
34
|
|
|
35
|
-
for module in (runtime_methods, goals, commands, kanban, state_db, profiles, skills, mcp, stt, cron, providers, oauth, aux, text, process, usage, gateway, worktree, chat, config):
|
|
35
|
+
for module in (runtime_methods, goals, commands, kanban, state_db, profiles, skills, mcp, stt, cron, providers, oauth, aux, text, process, usage, gateway, worktree, checkpoints, memory, chat, config, toolsets, write_approval, connectors):
|
|
36
36
|
module.register(registry)
|
|
37
37
|
return registry.methods
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import contextlib
|
|
6
|
+
import contextvars
|
|
7
|
+
import inspect
|
|
6
8
|
import logging
|
|
7
9
|
import threading
|
|
8
10
|
import uuid
|
|
@@ -69,14 +71,44 @@ def _main_model_completion(messages: list, runtime: dict, *, task: str) -> dict:
|
|
|
69
71
|
close()
|
|
70
72
|
except Exception: # noqa: BLE001
|
|
71
73
|
log.debug("%s fallback agent close failed", task, exc_info=True)
|
|
72
|
-
return {"model": str(runtime.get("model") or ""), "text": str((result or {}).get("final_response") or "").strip(), "usage": None}
|
|
74
|
+
return {"model": str(runtime.get("model") or ""), "text": str((result or {}).get("final_response") or "").strip(), "usage": None, "finish_reason": None}
|
|
73
75
|
|
|
74
76
|
|
|
75
|
-
def
|
|
77
|
+
def _model_completion(task: str, messages: list, *, model: str, provider: str | None, max_tokens: int | None, temperature: float | None, ctx: CallContext) -> dict:
|
|
78
|
+
"""TAL-258 (predecessor ``_agent_text_completion``): the named model answers itself through the Agent's ``call_llm``,
|
|
79
|
+
reasoning off and no tools, so the caller sees its ``finish_reason``. ``max_tokens`` reaches the provider on the routes
|
|
80
|
+
the Agent forwards a cap on. ``credential_missing`` when the model has no credential."""
|
|
81
|
+
from .chat import _resolve_runtime
|
|
82
|
+
|
|
83
|
+
runtime = _resolve_runtime(provider, model)
|
|
84
|
+
if not runtime.get("api_key"):
|
|
85
|
+
raise RpcError(f"no credential for model {model or 'default'!r}", condition="credential_missing")
|
|
86
|
+
resolved = model or str(runtime.get("model") or "")
|
|
87
|
+
response = _call_llm(
|
|
88
|
+
task, ctx, provider=provider or runtime.get("provider"), model=resolved, base_url=runtime.get("base_url"), api_key=runtime.get("api_key"),
|
|
89
|
+
api_mode=runtime.get("api_mode"), messages=messages, max_tokens=int(max_tokens) if max_tokens else None,
|
|
90
|
+
temperature=float(temperature) if temperature is not None else None, reasoning_config={"enabled": False}, timeout=30.0,
|
|
91
|
+
)
|
|
92
|
+
return _response_result(resolved, response)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _response_result(model: str, response) -> dict:
|
|
96
|
+
"""The ``aux.complete`` result for one complete (non-streamed) chat response; a response without a choice raises."""
|
|
97
|
+
choice = response.choices[0]
|
|
98
|
+
reason = getattr(choice, "finish_reason", None)
|
|
99
|
+
return {"model": str(model), "text": str(choice.message.content or "").strip(), "usage": _usage_dict(getattr(response, "usage", None)),
|
|
100
|
+
"finish_reason": str(reason) if reason else None}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def complete(task: str, messages: list, *, main_runtime: dict | None, max_tokens: int | None, temperature: float | None, ctx: CallContext, main_fallback: bool = False,
|
|
104
|
+
model: str | None = None, provider: str | None = None) -> dict:
|
|
76
105
|
"""One auxiliary completion; streams ``token`` frames when the client supports it.
|
|
77
106
|
|
|
78
107
|
With ``main_fallback`` the main model answers (through ``AIAgent``) when no auxiliary client is configured or the
|
|
79
|
-
auxiliary call fails, as the predecessor's git commit-message route did.
|
|
108
|
+
auxiliary call fails, as the predecessor's git commit-message route did. An explicit ``model`` skips the auxiliary
|
|
109
|
+
route: that model answers (``_model_completion``)."""
|
|
110
|
+
if model is not None:
|
|
111
|
+
return _model_completion(task, messages, model=model, provider=provider, max_tokens=max_tokens, temperature=temperature, ctx=ctx)
|
|
80
112
|
try:
|
|
81
113
|
from agent.auxiliary_client import get_text_auxiliary_client
|
|
82
114
|
except Exception as exc: # noqa: BLE001
|
|
@@ -90,46 +122,116 @@ def complete(task: str, messages: list, *, main_runtime: dict | None, max_tokens
|
|
|
90
122
|
if main_fallback and main_runtime and main_runtime.get("model"):
|
|
91
123
|
return _main_model_completion(messages, main_runtime, task=task)
|
|
92
124
|
raise RpcError(f"no auxiliary model configured for task {task!r}", condition="aux_unconfigured")
|
|
125
|
+
create, stream = _aux_request(task, client, model, messages, main_runtime=main_runtime, max_tokens=max_tokens, temperature=temperature, ctx=ctx)
|
|
93
126
|
if main_fallback and main_runtime and main_runtime.get("model"):
|
|
94
127
|
try:
|
|
95
|
-
return _stream_completion(
|
|
128
|
+
return _stream_completion(create, model, stream=stream, ctx=ctx)
|
|
96
129
|
except RpcError:
|
|
97
130
|
raise
|
|
98
131
|
except Exception as exc: # noqa: BLE001 - predecessor fell back to the main model
|
|
99
132
|
log.debug("auxiliary %s call failed; falling back to the main model: %s", task, exc)
|
|
100
133
|
return _main_model_completion(messages, main_runtime, task=task)
|
|
101
|
-
return _stream_completion(
|
|
134
|
+
return _stream_completion(create, model, stream=stream, ctx=ctx)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _permit_limited(task: str) -> bool:
|
|
138
|
+
"""Whether ``auxiliary.<task>.max_concurrency`` limits the task, so the Agent's ``call_llm`` may wait for a permit."""
|
|
139
|
+
from agent import auxiliary_client
|
|
140
|
+
|
|
141
|
+
acquire = getattr(auxiliary_client, "_acquire_sync_aux_semaphore", None)
|
|
142
|
+
return callable(acquire) and acquire(task) is not None
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _call_llm(task: str, ctx: CallContext, **kwargs):
|
|
146
|
+
"""The Agent's ``call_llm``. For a permit-limited task ``call_llm`` waits for the permit uncancellably, so the call
|
|
147
|
+
runs on a helper thread under the Agent's interrupt protection: a cancelled call returns at once and frees its
|
|
148
|
+
worker, and the Agent's protected provider call drops the request before dispatch once the permit comes."""
|
|
149
|
+
from agent import auxiliary_client
|
|
150
|
+
|
|
151
|
+
if not _permit_limited(task):
|
|
152
|
+
return auxiliary_client.call_llm(task, **kwargs)
|
|
153
|
+
outcome: dict = {}
|
|
154
|
+
done = threading.Event()
|
|
155
|
+
|
|
156
|
+
def run() -> None:
|
|
157
|
+
try:
|
|
158
|
+
with auxiliary_client.aux_interrupt_protection(cancel_event=ctx.cancel_event):
|
|
159
|
+
outcome["response"] = auxiliary_client.call_llm(task, **kwargs)
|
|
160
|
+
except BaseException as exc: # noqa: BLE001 - handed to the waiting worker
|
|
161
|
+
outcome["error"] = exc
|
|
162
|
+
finally:
|
|
163
|
+
done.set()
|
|
164
|
+
|
|
165
|
+
threading.Thread(target=contextvars.copy_context().run, args=(run,), daemon=True, name=f"aux-{task}").start()
|
|
166
|
+
while not done.wait(0.25):
|
|
167
|
+
ctx.check_cancelled()
|
|
168
|
+
ctx.check_cancelled()
|
|
169
|
+
if "error" in outcome:
|
|
170
|
+
raise outcome["error"]
|
|
171
|
+
return outcome["response"]
|
|
102
172
|
|
|
103
173
|
|
|
104
|
-
def
|
|
105
|
-
|
|
174
|
+
def _call_llm_streams() -> bool:
|
|
175
|
+
"""Whether the Agent's ``call_llm`` streams with a caller's main runtime (older Agents cannot)."""
|
|
176
|
+
try:
|
|
177
|
+
from agent.auxiliary_client import call_llm
|
|
178
|
+
except ImportError:
|
|
179
|
+
return False
|
|
180
|
+
return {"stream", "main_runtime"} <= inspect.signature(call_llm).parameters.keys()
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _aux_request(task: str, client, model: str, messages: list, *, main_runtime: dict | None, max_tokens: int | None, temperature: float | None, ctx: CallContext):
|
|
184
|
+
"""``(create(**stream), stream)`` for one auxiliary request. TAL-823: through the Agent's ``call_llm`` funnel (plugin
|
|
185
|
+
hooks, a custom provider's ``extra_body``, watchdogs, response unwrap, fallbacks) when it streams; else the raw
|
|
186
|
+
client. ``stream`` is False for a permit-limited task (its call must stay cancellable, see ``_call_llm``) and for
|
|
187
|
+
the Agent's Codex, Anthropic and Bedrock shims, which answer ``stream=True`` whole."""
|
|
188
|
+
kwargs: dict = {"messages": messages}
|
|
106
189
|
if max_tokens:
|
|
107
190
|
kwargs["max_tokens"] = int(max_tokens)
|
|
108
191
|
if temperature is not None:
|
|
109
192
|
kwargs["temperature"] = float(temperature)
|
|
193
|
+
stream = hasattr(client.chat.completions, "with_streaming_response")
|
|
194
|
+
if _call_llm_streams():
|
|
195
|
+
return (lambda **stream: _call_llm(task, ctx, main_runtime=main_runtime, **kwargs, **stream)), stream and not _permit_limited(task)
|
|
196
|
+
return (lambda **stream: client.chat.completions.create(model=model, **kwargs, **stream)), stream
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _stream_completion(create, model: str, *, stream: bool, ctx: CallContext) -> dict:
|
|
200
|
+
if not stream:
|
|
201
|
+
return _response_result(model, create())
|
|
110
202
|
text_parts: list[str] = []
|
|
111
203
|
usage = None
|
|
204
|
+
finish_reason = None
|
|
112
205
|
try:
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
206
|
+
chunks = create(stream=True)
|
|
207
|
+
if hasattr(chunks, "choices"): # the route resolved to a shim that answers ``stream=True`` whole
|
|
208
|
+
return _response_result(model, chunks)
|
|
209
|
+
try:
|
|
210
|
+
for chunk in chunks:
|
|
211
|
+
ctx.check_cancelled()
|
|
212
|
+
choices = getattr(chunk, "choices", None) or []
|
|
213
|
+
delta = getattr(choices[0], "delta", None) if choices else None
|
|
214
|
+
piece = getattr(delta, "content", None) if delta is not None else None
|
|
215
|
+
if piece:
|
|
216
|
+
text_parts.append(piece)
|
|
217
|
+
ctx.emit("token", {"text": piece})
|
|
218
|
+
if choices and getattr(choices[0], "finish_reason", None):
|
|
219
|
+
finish_reason = str(choices[0].finish_reason)
|
|
220
|
+
chunk_usage = getattr(chunk, "usage", None)
|
|
221
|
+
if chunk_usage is not None:
|
|
222
|
+
usage = _usage_dict(chunk_usage)
|
|
223
|
+
finally:
|
|
224
|
+
# Releases the connection and the Agent's per-task concurrency permit on cancel or failure, too.
|
|
225
|
+
close = getattr(chunks, "close", None)
|
|
226
|
+
if callable(close):
|
|
227
|
+
with contextlib.suppress(Exception):
|
|
228
|
+
close()
|
|
125
229
|
except RpcError:
|
|
126
230
|
raise
|
|
127
231
|
except Exception as exc: # noqa: BLE001 - fall back to a non-streaming call
|
|
128
232
|
log.debug("streaming auxiliary call failed (%s); retrying without stream", exc)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
usage = _usage_dict(getattr(response, "usage", None))
|
|
132
|
-
return {"model": str(model), "text": "".join(text_parts).strip(), "usage": usage}
|
|
233
|
+
return _response_result(model, create())
|
|
234
|
+
return {"model": str(model), "text": "".join(text_parts).strip(), "usage": usage, "finish_reason": finish_reason}
|
|
133
235
|
|
|
134
236
|
|
|
135
237
|
def _usage_dict(usage) -> dict | None:
|
|
@@ -143,6 +245,39 @@ def _usage_dict(usage) -> dict | None:
|
|
|
143
245
|
return out or None
|
|
144
246
|
|
|
145
247
|
|
|
248
|
+
def _effort_word(task_cfg: dict) -> str:
|
|
249
|
+
"""Agent ``_aux_effort_word``: the resolved ``reasoning_effort`` ("" = provider default; YAML False = "none")."""
|
|
250
|
+
raw = task_cfg.get("reasoning_effort")
|
|
251
|
+
return "none" if raw is False else str(raw or "").strip().lower()
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def aux_tasks() -> dict:
|
|
255
|
+
"""TAL-800: the home's auxiliary slots in Agent order, the ``hermes model`` picker's built-ins then the home's plugin
|
|
256
|
+
tasks, each with its resolved reasoning effort and, for a task that inherits another slot, its effective route.
|
|
257
|
+
``reserved`` names the Agent's other ``auxiliary.*`` keys (settings and unlisted routes), which are never slots."""
|
|
258
|
+
from agent.auxiliary_client import _get_auxiliary_task_config
|
|
259
|
+
from hermes_cli.config import DEFAULT_CONFIG
|
|
260
|
+
from hermes_cli.main_provider_setup import _AUX_TASKS
|
|
261
|
+
|
|
262
|
+
rows = [{"key": key, "label": label, "description": description, "inherit_from": None} for key, label, description in _AUX_TASKS]
|
|
263
|
+
builtin = {row["key"] for row in rows}
|
|
264
|
+
try:
|
|
265
|
+
from hermes_cli.plugins import get_plugin_auxiliary_tasks
|
|
266
|
+
|
|
267
|
+
plugin_tasks = [entry for entry in get_plugin_auxiliary_tasks() if entry.get("key") and entry["key"] not in builtin]
|
|
268
|
+
except Exception: # noqa: BLE001 - plugin discovery must never hide the built-in slots (the Agent's own rule)
|
|
269
|
+
log.debug("plugin auxiliary task lookup failed", exc_info=True)
|
|
270
|
+
plugin_tasks = []
|
|
271
|
+
rows += [{"key": str(entry["key"]), "label": str(entry.get("display_name") or entry["key"]), "description": str(entry.get("description") or ""),
|
|
272
|
+
"inherit_from": str(entry.get("inherit_from") or "") or None} for entry in plugin_tasks]
|
|
273
|
+
for row in rows:
|
|
274
|
+
resolved = _get_auxiliary_task_config(row["key"])
|
|
275
|
+
row["reasoning_effort"] = _effort_word(resolved)
|
|
276
|
+
row["effective"] = {field: str(resolved.get(field) or "") for field in ("provider", "model", "base_url")} if row["inherit_from"] else None
|
|
277
|
+
listed = {row["key"] for row in rows}
|
|
278
|
+
return {"tasks": rows, "reserved": sorted(key for key in (DEFAULT_CONFIG.get("auxiliary") or {}) if key not in listed)}
|
|
279
|
+
|
|
280
|
+
|
|
146
281
|
def register(registry) -> None:
|
|
147
282
|
@registry.method("aux.complete")
|
|
148
283
|
def complete_(ctx: CallContext, params: dict) -> dict:
|
|
@@ -154,7 +289,14 @@ def register(registry) -> None:
|
|
|
154
289
|
raise InvalidParams("messages must be a non-empty list")
|
|
155
290
|
main_runtime = params.get("main_runtime") if isinstance(params.get("main_runtime"), dict) else None
|
|
156
291
|
with scoped_home(profile_home_param(params)):
|
|
157
|
-
|
|
292
|
+
model = params.get("model")
|
|
293
|
+
return complete(task, messages, main_runtime=main_runtime, max_tokens=params.get("max_tokens"), temperature=params.get("temperature"), ctx=ctx, main_fallback=bool(params.get("main_fallback")),
|
|
294
|
+
model=str(model).strip() if isinstance(model, str) else None, provider=str(params.get("provider") or "").strip() or None)
|
|
295
|
+
|
|
296
|
+
@registry.method("aux.tasks")
|
|
297
|
+
def tasks(ctx: CallContext, params: dict) -> dict:
|
|
298
|
+
with scoped_home(profile_home_param(params)):
|
|
299
|
+
return aux_tasks()
|
|
158
300
|
|
|
159
301
|
@registry.method("aux.resolve")
|
|
160
302
|
def resolve(ctx: CallContext, params: dict) -> dict:
|