@maudecode/talaria-web 0.0.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/contract_versions.json +18 -0
- package/dist/api/auth-raw.d.ts +9 -0
- package/dist/api/auth-raw.js +134 -0
- package/dist/api/auth-raw.js.map +1 -0
- package/dist/api/automation-raw.d.ts +16 -0
- package/dist/api/automation-raw.js +340 -0
- package/dist/api/automation-raw.js.map +1 -0
- package/dist/api/automation-router.d.ts +788 -0
- package/dist/api/automation-router.js +248 -0
- package/dist/api/automation-router.js.map +1 -0
- package/dist/api/chat-router.d.ts +375 -0
- package/dist/api/chat-router.js +446 -0
- package/dist/api/chat-router.js.map +1 -0
- package/dist/api/git-router.d.ts +681 -0
- package/dist/api/git-router.js +275 -0
- package/dist/api/git-router.js.map +1 -0
- package/dist/api/raw-routes.d.ts +10 -0
- package/dist/api/raw-routes.js +466 -0
- package/dist/api/raw-routes.js.map +1 -0
- package/dist/api/router.d.ts +226 -0
- package/dist/api/router.js +331 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/session-visibility.d.ts +12 -0
- package/dist/api/session-visibility.js +51 -0
- package/dist/api/session-visibility.js.map +1 -0
- package/dist/api/sessions-router.d.ts +1728 -0
- package/dist/api/sessions-router.js +815 -0
- package/dist/api/sessions-router.js.map +1 -0
- package/dist/api/settings-router.d.ts +592 -0
- package/dist/api/settings-router.js +474 -0
- package/dist/api/settings-router.js.map +1 -0
- package/dist/api/sse-routes.d.ts +51 -0
- package/dist/api/sse-routes.js +602 -0
- package/dist/api/sse-routes.js.map +1 -0
- package/dist/api/tools-raw.d.ts +5 -0
- package/dist/api/tools-raw.js +291 -0
- package/dist/api/tools-raw.js.map +1 -0
- package/dist/api/tools-router.d.ts +494 -0
- package/dist/api/tools-router.js +349 -0
- package/dist/api/tools-router.js.map +1 -0
- package/dist/app.d.ts +4787 -0
- package/dist/app.js +453 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/cookies.d.ts +17 -0
- package/dist/auth/cookies.js +42 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/crypto.d.ts +9 -0
- package/dist/auth/crypto.js +38 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/gate.d.ts +39 -0
- package/dist/auth/gate.js +406 -0
- package/dist/auth/gate.js.map +1 -0
- package/dist/auth/oidc.d.ts +138 -0
- package/dist/auth/oidc.js +836 -0
- package/dist/auth/oidc.js.map +1 -0
- package/dist/auth/passkeys.d.ts +49 -0
- package/dist/auth/passkeys.js +310 -0
- package/dist/auth/passkeys.js.map +1 -0
- package/dist/auth/store.d.ts +116 -0
- package/dist/auth/store.js +485 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/bin/talaria-web-mcp.d.ts +2 -0
- package/dist/bin/talaria-web-mcp.js +12 -0
- package/dist/bin/talaria-web-mcp.js.map +1 -0
- package/dist/bin/talaria-web.d.ts +2 -0
- package/dist/bin/talaria-web.js +87 -0
- package/dist/bin/talaria-web.js.map +1 -0
- package/dist/cli/ctl.d.ts +58 -0
- package/dist/cli/ctl.js +643 -0
- package/dist/cli/ctl.js.map +1 -0
- package/dist/cli/dotenv.d.ts +30 -0
- package/dist/cli/dotenv.js +115 -0
- package/dist/cli/dotenv.js.map +1 -0
- package/dist/cli/launcher.d.ts +49 -0
- package/dist/cli/launcher.js +213 -0
- package/dist/cli/launcher.js.map +1 -0
- package/dist/cli/supervise.d.ts +10 -0
- package/dist/cli/supervise.js +33 -0
- package/dist/cli/supervise.js.map +1 -0
- package/dist/cli/web-root.d.ts +2 -0
- package/dist/cli/web-root.js +23 -0
- package/dist/cli/web-root.js.map +1 -0
- package/dist/config/agent-config.d.ts +109 -0
- package/dist/config/agent-config.js +632 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +105 -0
- package/dist/config.js.map +1 -0
- package/dist/fs/atomic.d.ts +7 -0
- package/dist/fs/atomic.js +68 -0
- package/dist/fs/atomic.js.map +1 -0
- package/dist/http/addresses.d.ts +5 -0
- package/dist/http/addresses.js +68 -0
- package/dist/http/addresses.js.map +1 -0
- package/dist/http/capped.d.ts +2 -0
- package/dist/http/capped.js +22 -0
- package/dist/http/capped.js.map +1 -0
- package/dist/http/context.d.ts +281 -0
- package/dist/http/context.js +327 -0
- package/dist/http/context.js.map +1 -0
- package/dist/http/csp.d.ts +11 -0
- package/dist/http/csp.js +51 -0
- package/dist/http/csp.js.map +1 -0
- package/dist/http/origin.d.ts +39 -0
- package/dist/http/origin.js +183 -0
- package/dist/http/origin.js.map +1 -0
- package/dist/http/pinned.d.ts +18 -0
- package/dist/http/pinned.js +62 -0
- package/dist/http/pinned.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +29 -0
- package/dist/mcp/server.js +221 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/onboarding.d.ts +57 -0
- package/dist/onboarding.js +381 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/profiles/profiles.d.ts +96 -0
- package/dist/profiles/profiles.js +476 -0
- package/dist/profiles/profiles.js.map +1 -0
- package/dist/projects.d.ts +36 -0
- package/dist/projects.js +102 -0
- package/dist/projects.js.map +1 -0
- package/dist/providers/catalog.d.ts +118 -0
- package/dist/providers/catalog.js +868 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/env-file.d.ts +6 -0
- package/dist/providers/env-file.js +106 -0
- package/dist/providers/env-file.js.map +1 -0
- package/dist/providers/runtime-env.d.ts +20 -0
- package/dist/providers/runtime-env.js +85 -0
- package/dist/providers/runtime-env.js.map +1 -0
- package/dist/providers/tables.d.ts +54 -0
- package/dist/providers/tables.js +54 -0
- package/dist/providers/tables.js.map +1 -0
- package/dist/redact.d.ts +23 -0
- package/dist/redact.js +337 -0
- package/dist/redact.js.map +1 -0
- package/dist/release.d.ts +16 -0
- package/dist/release.js +114 -0
- package/dist/release.js.map +1 -0
- package/dist/runtime.d.ts +21 -0
- package/dist/runtime.js +680 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.js +90 -0
- package/dist/server.js.map +1 -0
- package/dist/sessions/anchor.d.ts +43 -0
- package/dist/sessions/anchor.js +311 -0
- package/dist/sessions/anchor.js.map +1 -0
- package/dist/sessions/cli-sessions.d.ts +27 -0
- package/dist/sessions/cli-sessions.js +158 -0
- package/dist/sessions/cli-sessions.js.map +1 -0
- package/dist/sessions/completions.d.ts +62 -0
- package/dist/sessions/completions.js +332 -0
- package/dist/sessions/completions.js.map +1 -0
- package/dist/sessions/drafts.d.ts +26 -0
- package/dist/sessions/drafts.js +117 -0
- package/dist/sessions/drafts.js.map +1 -0
- package/dist/sessions/events.d.ts +32 -0
- package/dist/sessions/events.js +80 -0
- package/dist/sessions/events.js.map +1 -0
- package/dist/sessions/export.d.ts +4 -0
- package/dist/sessions/export.js +186 -0
- package/dist/sessions/export.js.map +1 -0
- package/dist/sessions/gateway-watcher.d.ts +58 -0
- package/dist/sessions/gateway-watcher.js +199 -0
- package/dist/sessions/gateway-watcher.js.map +1 -0
- package/dist/sessions/journal.d.ts +103 -0
- package/dist/sessions/journal.js +543 -0
- package/dist/sessions/journal.js.map +1 -0
- package/dist/sessions/list.d.ts +130 -0
- package/dist/sessions/list.js +846 -0
- package/dist/sessions/list.js.map +1 -0
- package/dist/sessions/merge.d.ts +57 -0
- package/dist/sessions/merge.js +517 -0
- package/dist/sessions/merge.js.map +1 -0
- package/dist/sessions/pending.d.ts +69 -0
- package/dist/sessions/pending.js +271 -0
- package/dist/sessions/pending.js.map +1 -0
- package/dist/sessions/reasoning-titles.d.ts +31 -0
- package/dist/sessions/reasoning-titles.js +143 -0
- package/dist/sessions/reasoning-titles.js.map +1 -0
- package/dist/sessions/relay.d.ts +131 -0
- package/dist/sessions/relay.js +577 -0
- package/dist/sessions/relay.js.map +1 -0
- package/dist/sessions/service.d.ts +189 -0
- package/dist/sessions/service.js +1344 -0
- package/dist/sessions/service.js.map +1 -0
- package/dist/sessions/session.d.ts +131 -0
- package/dist/sessions/session.js +505 -0
- package/dist/sessions/session.js.map +1 -0
- package/dist/sessions/shares.d.ts +31 -0
- package/dist/sessions/shares.js +267 -0
- package/dist/sessions/shares.js.map +1 -0
- package/dist/sessions/state-db.d.ts +52 -0
- package/dist/sessions/state-db.js +641 -0
- package/dist/sessions/state-db.js.map +1 -0
- package/dist/sessions/state-saved.d.ts +13 -0
- package/dist/sessions/state-saved.js +47 -0
- package/dist/sessions/state-saved.js.map +1 -0
- package/dist/sessions/store.d.ts +124 -0
- package/dist/sessions/store.js +790 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/streams.d.ts +90 -0
- package/dist/sessions/streams.js +200 -0
- package/dist/sessions/streams.js.map +1 -0
- package/dist/sessions/titles.d.ts +17 -0
- package/dist/sessions/titles.js +231 -0
- package/dist/sessions/titles.js.map +1 -0
- package/dist/sessions/todo.d.ts +8 -0
- package/dist/sessions/todo.js +72 -0
- package/dist/sessions/todo.js.map +1 -0
- package/dist/sessions/turn-context.d.ts +27 -0
- package/dist/sessions/turn-context.js +136 -0
- package/dist/sessions/turn-context.js.map +1 -0
- package/dist/sessions/turn.d.ts +178 -0
- package/dist/sessions/turn.js +1357 -0
- package/dist/sessions/turn.js.map +1 -0
- package/dist/sessions/window.d.ts +10 -0
- package/dist/sessions/window.js +151 -0
- package/dist/sessions/window.js.map +1 -0
- package/dist/settings.d.ts +57 -0
- package/dist/settings.js +481 -0
- package/dist/settings.js.map +1 -0
- package/dist/sidecar/client.d.ts +75 -0
- package/dist/sidecar/client.js +252 -0
- package/dist/sidecar/client.js.map +1 -0
- package/dist/sidecar/discover.d.ts +22 -0
- package/dist/sidecar/discover.js +146 -0
- package/dist/sidecar/discover.js.map +1 -0
- package/dist/sidecar/fake.d.ts +37 -0
- package/dist/sidecar/fake.js +79 -0
- package/dist/sidecar/fake.js.map +1 -0
- package/dist/spa.d.ts +42 -0
- package/dist/spa.js +145 -0
- package/dist/spa.js.map +1 -0
- package/dist/startup.d.ts +19 -0
- package/dist/startup.js +44 -0
- package/dist/startup.js.map +1 -0
- package/dist/test/harness.d.ts +41 -0
- package/dist/test/harness.js +123 -0
- package/dist/test/harness.js.map +1 -0
- package/dist/text/diff.d.ts +16 -0
- package/dist/text/diff.js +122 -0
- package/dist/text/diff.js.map +1 -0
- package/dist/text/markdown.d.ts +8 -0
- package/dist/text/markdown.js +185 -0
- package/dist/text/markdown.js.map +1 -0
- package/dist/tools/crons.d.ts +51 -0
- package/dist/tools/crons.js +317 -0
- package/dist/tools/crons.js.map +1 -0
- package/dist/tools/extensions.d.ts +92 -0
- package/dist/tools/extensions.js +1096 -0
- package/dist/tools/extensions.js.map +1 -0
- package/dist/tools/health.d.ts +21 -0
- package/dist/tools/health.js +334 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/hygiene.d.ts +29 -0
- package/dist/tools/hygiene.js +112 -0
- package/dist/tools/hygiene.js.map +1 -0
- package/dist/tools/insights.d.ts +3 -0
- package/dist/tools/insights.js +92 -0
- package/dist/tools/insights.js.map +1 -0
- package/dist/tools/kanban.d.ts +25 -0
- package/dist/tools/kanban.js +79 -0
- package/dist/tools/kanban.js.map +1 -0
- package/dist/tools/mcp-health.d.ts +28 -0
- package/dist/tools/mcp-health.js +207 -0
- package/dist/tools/mcp-health.js.map +1 -0
- package/dist/tools/mcp.d.ts +34 -0
- package/dist/tools/mcp.js +269 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/memory.d.ts +20 -0
- package/dist/tools/memory.js +216 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/skills.d.ts +43 -0
- package/dist/tools/skills.js +193 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/terminal.d.ts +96 -0
- package/dist/tools/terminal.js +324 -0
- package/dist/tools/terminal.js.map +1 -0
- package/dist/tools/updates.d.ts +151 -0
- package/dist/tools/updates.js +1151 -0
- package/dist/tools/updates.js.map +1 -0
- package/dist/util.d.ts +6 -0
- package/dist/util.js +40 -0
- package/dist/util.js.map +1 -0
- package/dist/workspace/fs.d.ts +61 -0
- package/dist/workspace/fs.js +555 -0
- package/dist/workspace/fs.js.map +1 -0
- package/dist/workspace/git.d.ts +204 -0
- package/dist/workspace/git.js +1236 -0
- package/dist/workspace/git.js.map +1 -0
- package/dist/workspace/media.d.ts +47 -0
- package/dist/workspace/media.js +448 -0
- package/dist/workspace/media.js.map +1 -0
- package/dist/workspace/paths.d.ts +6 -0
- package/dist/workspace/paths.js +41 -0
- package/dist/workspace/paths.js.map +1 -0
- package/dist/workspace/rollback.d.ts +29 -0
- package/dist/workspace/rollback.js +337 -0
- package/dist/workspace/rollback.js.map +1 -0
- package/dist/workspace/unzip.d.ts +9 -0
- package/dist/workspace/unzip.js +61 -0
- package/dist/workspace/unzip.js.map +1 -0
- package/dist/workspace/upload.d.ts +40 -0
- package/dist/workspace/upload.js +215 -0
- package/dist/workspace/upload.js.map +1 -0
- package/dist/workspace/workspaces.d.ts +84 -0
- package/dist/workspace/workspaces.js +663 -0
- package/dist/workspace/workspaces.js.map +1 -0
- package/dist/workspace/worktrees.d.ts +14 -0
- package/dist/workspace/worktrees.js +171 -0
- package/dist/workspace/worktrees.js.map +1 -0
- package/dist/workspace/zip.d.ts +16 -0
- package/dist/workspace/zip.js +205 -0
- package/dist/workspace/zip.js.map +1 -0
- package/package.json +54 -0
- package/sidecar/agent_dependency.json +11 -0
- package/sidecar/scripts/record-fixtures.py +72 -0
- package/sidecar/scripts/replay_sidecar.py +113 -0
- package/sidecar/scripts/test.sh +22 -0
- package/sidecar/talaria_sidecar/__init__.py +10 -0
- package/sidecar/talaria_sidecar/__main__.py +46 -0
- package/sidecar/talaria_sidecar/errors.py +41 -0
- package/sidecar/talaria_sidecar/home.py +103 -0
- package/sidecar/talaria_sidecar/methods/__init__.py +37 -0
- package/sidecar/talaria_sidecar/methods/aux.py +160 -0
- package/sidecar/talaria_sidecar/methods/chat.py +791 -0
- package/sidecar/talaria_sidecar/methods/commands.py +340 -0
- package/sidecar/talaria_sidecar/methods/config.py +131 -0
- package/sidecar/talaria_sidecar/methods/cron.py +558 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +106 -0
- package/sidecar/talaria_sidecar/methods/goals.py +225 -0
- package/sidecar/talaria_sidecar/methods/kanban.py +723 -0
- package/sidecar/talaria_sidecar/methods/mcp.py +65 -0
- package/sidecar/talaria_sidecar/methods/process.py +155 -0
- package/sidecar/talaria_sidecar/methods/profiles.py +254 -0
- package/sidecar/talaria_sidecar/methods/providers.py +241 -0
- package/sidecar/talaria_sidecar/methods/runtime.py +68 -0
- package/sidecar/talaria_sidecar/methods/skills.py +262 -0
- package/sidecar/talaria_sidecar/methods/state_db.py +418 -0
- package/sidecar/talaria_sidecar/methods/stt.py +131 -0
- package/sidecar/talaria_sidecar/methods/text.py +85 -0
- package/sidecar/talaria_sidecar/methods/usage.py +59 -0
- package/sidecar/talaria_sidecar/methods/worktree.py +71 -0
- package/sidecar/talaria_sidecar/rpc.py +218 -0
- package/sidecar/talaria_sidecar/runtime.py +330 -0
- package/static/brand/apple-touch-icon.png +0 -0
- package/static/brand/brandmark.svg +12 -0
- package/static/brand/favicon-192.png +0 -0
- package/static/brand/favicon-32.png +0 -0
- package/static/brand/favicon-512.png +0 -0
- package/static/brand/favicon-512.svg +14 -0
- package/static/brand/favicon-dark.svg +14 -0
- package/static/brand/favicon-light.svg +14 -0
- package/static/brand/favicon.ico +0 -0
- package/static/brand/favicon.svg +14 -0
- package/static/dist/FILES.txt +515 -0
- package/static/dist/assets/AppShell-gs0grlbs.js +1 -0
- package/static/dist/assets/ChatPage-gi1xlz52.js +18 -0
- package/static/dist/assets/ChatPage-gmu5c7lf.css +1 -0
- package/static/dist/assets/HubRoute-qs9vzuh0.js +2 -0
- package/static/dist/assets/InterVariable-nonokl6i.woff2 +0 -0
- package/static/dist/assets/KaTeX_AMS-Regular-e1why8ff.woff2 +0 -0
- package/static/dist/assets/KaTeX_AMS-Regular-mec5w1mt.woff +0 -0
- package/static/dist/assets/KaTeX_AMS-Regular-mos1wgtv.ttf +0 -0
- package/static/dist/assets/KaTeX_Caligraphic-Bold-axibvb5b.ttf +0 -0
- package/static/dist/assets/KaTeX_Caligraphic-Bold-eccvbn5c.woff +0 -0
- package/static/dist/assets/KaTeX_Caligraphic-Bold-n63xiolk.woff2 +0 -0
- package/static/dist/assets/KaTeX_Caligraphic-Regular-c5dvswgu.ttf +0 -0
- package/static/dist/assets/KaTeX_Caligraphic-Regular-iz5gexw5.woff +0 -0
- package/static/dist/assets/KaTeX_Caligraphic-Regular-npwmqylf.woff2 +0 -0
- package/static/dist/assets/KaTeX_Fraktur-Bold-ftsn4fxp.ttf +0 -0
- package/static/dist/assets/KaTeX_Fraktur-Bold-gokmhdpe.woff +0 -0
- package/static/dist/assets/KaTeX_Fraktur-Bold-ikhebgtj.woff2 +0 -0
- package/static/dist/assets/KaTeX_Fraktur-Regular-hzce8q9o.ttf +0 -0
- package/static/dist/assets/KaTeX_Fraktur-Regular-i0egury6.woff2 +0 -0
- package/static/dist/assets/KaTeX_Fraktur-Regular-okwm110b.woff +0 -0
- package/static/dist/assets/KaTeX_Main-Bold-c5g2m5kh.ttf +0 -0
- package/static/dist/assets/KaTeX_Main-Bold-ktk38ybk.woff2 +0 -0
- package/static/dist/assets/KaTeX_Main-Bold-ureqgmzo.woff +0 -0
- package/static/dist/assets/KaTeX_Main-BoldItalic-bd0upj71.woff +0 -0
- package/static/dist/assets/KaTeX_Main-BoldItalic-oj033t4i.woff2 +0 -0
- package/static/dist/assets/KaTeX_Main-BoldItalic-opttanob.ttf +0 -0
- package/static/dist/assets/KaTeX_Main-Italic-2p4bq1jf.woff2 +0 -0
- package/static/dist/assets/KaTeX_Main-Italic-dj86j9xo.ttf +0 -0
- package/static/dist/assets/KaTeX_Main-Italic-esmxqs8d.woff +0 -0
- package/static/dist/assets/KaTeX_Main-Regular-c978jrkj.ttf +0 -0
- package/static/dist/assets/KaTeX_Main-Regular-hbkzldb8.woff2 +0 -0
- package/static/dist/assets/KaTeX_Main-Regular-n865mmt0.woff +0 -0
- package/static/dist/assets/KaTeX_Math-BoldItalic-cbkxiib1.woff +0 -0
- package/static/dist/assets/KaTeX_Math-BoldItalic-hcom2j4y.ttf +0 -0
- package/static/dist/assets/KaTeX_Math-BoldItalic-jdo1yxu8.woff2 +0 -0
- package/static/dist/assets/KaTeX_Math-Italic-b5lfnctb.ttf +0 -0
- package/static/dist/assets/KaTeX_Math-Italic-cz4b2ure.woff2 +0 -0
- package/static/dist/assets/KaTeX_Math-Italic-lo894bvj.woff +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Bold-h55uj19s.ttf +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Bold-m9bkcp3c.woff +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Bold-otxc8itm.woff2 +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Italic-bp85cocg.ttf +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Italic-g42k16nn.woff +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Italic-k4kksncm.woff2 +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Regular-evq9548m.ttf +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Regular-izeggh93.woff +0 -0
- package/static/dist/assets/KaTeX_SansSerif-Regular-ltw53ck4.woff2 +0 -0
- package/static/dist/assets/KaTeX_Script-Regular-k8v4ghws.ttf +0 -0
- package/static/dist/assets/KaTeX_Script-Regular-o2nd302f.woff +0 -0
- package/static/dist/assets/KaTeX_Script-Regular-oybd33cp.woff2 +0 -0
- package/static/dist/assets/KaTeX_Size1-Regular-cjccv44r.woff2 +0 -0
- package/static/dist/assets/KaTeX_Size1-Regular-k13yopgz.woff +0 -0
- package/static/dist/assets/KaTeX_Size1-Regular-naiuhmx7.ttf +0 -0
- package/static/dist/assets/KaTeX_Size2-Regular-cnnxwlt7.woff +0 -0
- package/static/dist/assets/KaTeX_Size2-Regular-hlh6jazj.ttf +0 -0
- package/static/dist/assets/KaTeX_Size2-Regular-onxq3bzc.woff2 +0 -0
- package/static/dist/assets/KaTeX_Size3-Regular-i00haf83.woff +0 -0
- package/static/dist/assets/KaTeX_Size3-Regular-nk2kx36d.ttf +0 -0
- package/static/dist/assets/KaTeX_Size4-Regular-effsfy3y.woff +0 -0
- package/static/dist/assets/KaTeX_Size4-Regular-myjqyche.ttf +0 -0
- package/static/dist/assets/KaTeX_Size4-Regular-nv9nppzf.woff2 +0 -0
- package/static/dist/assets/KaTeX_Typewriter-Regular-iqvr3vwu.woff2 +0 -0
- package/static/dist/assets/KaTeX_Typewriter-Regular-kzj4h457.woff +0 -0
- package/static/dist/assets/KaTeX_Typewriter-Regular-owzsy8p5.ttf +0 -0
- package/static/dist/assets/Markdown-bt9bqd6a.js +598 -0
- package/static/dist/assets/Markdown-lwviulmg.css +1 -0
- package/static/dist/assets/RightPanel-dn19xu42.js +1 -0
- package/static/dist/assets/Select-y7wtf85g.js +1 -0
- package/static/dist/assets/SessionListPanel-igwdj9xr.js +1 -0
- package/static/dist/assets/SettingsLayout-n6mu0ghg.js +1 -0
- package/static/dist/assets/States-oil2issf.js +1 -0
- package/static/dist/assets/Toaster-jtn59pjm.js +1 -0
- package/static/dist/assets/_app-k4jrkgfa.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-mmf1mepm.js +1 -0
- package/static/dist/assets/_app.index-mb41nf00.js +1 -0
- package/static/dist/assets/_app.insights-mz5cep8m.js +1 -0
- package/static/dist/assets/_app.kanban-ocgw506i.js +1 -0
- package/static/dist/assets/_app.logs-lstmoju6.js +1 -0
- package/static/dist/assets/_app.memory-dishj9ra.js +1 -0
- package/static/dist/assets/_app.profiles-dynpvsio.js +1 -0
- package/static/dist/assets/_app.session._sessionId-kevi4qd2.js +1 -0
- package/static/dist/assets/_app.settings-c2czm9v4.js +1 -0
- package/static/dist/assets/_app.settings._section-exwflld7.js +1 -0
- package/static/dist/assets/_app.skills-j5jh2nug.js +1 -0
- package/static/dist/assets/_app.tasks-b99d98fo.js +2 -0
- package/static/dist/assets/_app.todos-ma8urvn3.js +1 -0
- package/static/dist/assets/_app.workspaces-l86cxeod.js +1 -0
- package/static/dist/assets/abap-ij37pki6.js +1 -0
- package/static/dist/assets/abnfDiagram-VCTEODGH-hvrr25lb.js +1 -0
- package/static/dist/assets/actionscript-3-dz7y3j1x.js +1 -0
- package/static/dist/assets/ada-k9zgv987.js +1 -0
- package/static/dist/assets/andromeeda-c2n0n86o.js +1 -0
- package/static/dist/assets/angular-html-nu6l31w3.js +1 -0
- package/static/dist/assets/angular-ts-fbx4f8mm.js +1 -0
- package/static/dist/assets/apache-binppq6z.js +1 -0
- package/static/dist/assets/apex-h8illjly.js +1 -0
- package/static/dist/assets/apl-bx2xr7dh.js +1 -0
- package/static/dist/assets/applescript-h0ok5sww.js +1 -0
- package/static/dist/assets/ara-dlpjioua.js +1 -0
- package/static/dist/assets/arc-7popfhbk.js +1 -0
- package/static/dist/assets/architecture-7GRP2DOG-mqft9w2p.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-b3r0z8sq.js +36 -0
- package/static/dist/assets/array-f36850hm.js +1 -0
- package/static/dist/assets/asciidoc-lx0cuujr.js +1 -0
- package/static/dist/assets/asm-j5diz3sz.js +1 -0
- package/static/dist/assets/astro-g77i97cb.js +1 -0
- package/static/dist/assets/aurora-x-h2hngdsl.js +1 -0
- package/static/dist/assets/awk-fecghegf.js +1 -0
- package/static/dist/assets/ayu-dark-nvvuggz9.js +1 -0
- package/static/dist/assets/ayu-light-k5fxgplt.js +1 -0
- package/static/dist/assets/ayu-mirage-gltrvhcx.js +1 -0
- package/static/dist/assets/ballerina-hk9oga18.js +1 -0
- package/static/dist/assets/bat-ghs7lag5.js +1 -0
- package/static/dist/assets/beancount-pc6q2dmq.js +1 -0
- package/static/dist/assets/berry-l96jp8n4.js +1 -0
- package/static/dist/assets/bibtex-jxn7maz2.js +1 -0
- package/static/dist/assets/bicep-i1yv3ngd.js +1 -0
- package/static/dist/assets/bird2-k3aagqn0.js +1 -0
- package/static/dist/assets/blade-boo0u92y.js +1 -0
- package/static/dist/assets/blockDiagram-I7D4REHJ-hd3gw0cj.js +129 -0
- package/static/dist/assets/bsl-f8m1ja7w.js +1 -0
- package/static/dist/assets/c-cat0w3sc.js +1 -0
- package/static/dist/assets/c3-j6ile59o.js +1 -0
- package/static/dist/assets/c4Diagram-7LVT6UL2-jlmbjiji.js +38 -0
- package/static/dist/assets/cadence-e3x2pgsu.js +1 -0
- package/static/dist/assets/cairo-mblac9dt.js +1 -0
- package/static/dist/assets/catppuccin-frappe-dj7qsd4s.js +1 -0
- package/static/dist/assets/catppuccin-latte-oh2bx7qn.js +1 -0
- package/static/dist/assets/catppuccin-macchiato-m3xyazph.js +1 -0
- package/static/dist/assets/catppuccin-mocha-m3rjj89j.js +1 -0
- package/static/dist/assets/channel-ix8cxdld.js +1 -0
- package/static/dist/assets/chunk-2Q5K7J3B-k08c29qw.js +1 -0
- package/static/dist/assets/chunk-4HAMMTFA-oydbpsin.js +62 -0
- package/static/dist/assets/chunk-5VM5RSS4-br0zxsux.js +15 -0
- package/static/dist/assets/chunk-75Z2AOVW-j633otj1.js +2 -0
- package/static/dist/assets/chunk-DU6HZSFF-ods2l027.js +128 -0
- package/static/dist/assets/chunk-F27PBJKO-ln4n2cwt.js +1 -0
- package/static/dist/assets/chunk-FOHPRMQF-opuflp73.js +161 -0
- package/static/dist/assets/chunk-GMAD6QVW-fpz133eh.js +72 -0
- package/static/dist/assets/chunk-GVQU2GXP-abs9ixiy.js +1 -0
- package/static/dist/assets/chunk-IMKFNOWR-j9vukdy1.js +231 -0
- package/static/dist/assets/chunk-JWPE2WC7-mw03m5s9.js +1 -0
- package/static/dist/assets/chunk-L3NEJ4N5-cfyw87r3.js +1 -0
- package/static/dist/assets/chunk-OSK3NFVY-baja78wr.js +10 -0
- package/static/dist/assets/chunk-P2QGCYS3-g66xby8h.js +1 -0
- package/static/dist/assets/chunk-POPQ4Y6H-osqu864t.js +1 -0
- package/static/dist/assets/chunk-PWAF6VOD-egejasv1.js +1 -0
- package/static/dist/assets/chunk-SHT3W25Y-l014h8zz.js +168 -0
- package/static/dist/assets/chunk-SVP7TREG-n3z10bp3.js +88 -0
- package/static/dist/assets/chunk-TICWLB2K-bzozkjc0.js +206 -0
- package/static/dist/assets/chunk-XXDRQBXY-n40pf9vy.js +1 -0
- package/static/dist/assets/chunk-Y2CYZVJY-n9gs7k4d.js +1 -0
- package/static/dist/assets/clarity-bdn1d8fx.js +1 -0
- package/static/dist/assets/classDiagram-ZZMXUADV-c210y3il.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-c210y3il.js +1 -0
- package/static/dist/assets/clojure-n5b9o4lq.js +1 -0
- package/static/dist/assets/cmake-f68p68h5.js +1 -0
- package/static/dist/assets/cobol-go622aep.js +1 -0
- package/static/dist/assets/codeowners-lgfjmw2s.js +1 -0
- package/static/dist/assets/codeql-cojlysyb.js +1 -0
- package/static/dist/assets/coffee-jwo1xjhq.js +1 -0
- package/static/dist/assets/common-lisp-ko58h8pe.js +1 -0
- package/static/dist/assets/copied-cjsttec1.js +1 -0
- package/static/dist/assets/coq-gns70ukp.js +1 -0
- package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +1 -0
- package/static/dist/assets/cpp-nre7j0kq.js +1 -0
- package/static/dist/assets/crystal-lviso2je.js +1 -0
- package/static/dist/assets/csharp-kkz9hcxp.js +1 -0
- package/static/dist/assets/css-ywz9j4hb.js +1 -0
- package/static/dist/assets/csv-ol0sxk26.js +1 -0
- package/static/dist/assets/cue-h5naoluy.js +1 -0
- package/static/dist/assets/cynefin-OW5HDTMX-elpt7h1j.js +1 -0
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-5mzl5pi2.js +62 -0
- package/static/dist/assets/cypher-j2an42no.js +1 -0
- package/static/dist/assets/cytoscape.esm-bqu53u12.js +321 -0
- package/static/dist/assets/d-crxkca3p.js +1 -0
- package/static/dist/assets/dagre-GXQ25YYZ-ihwlhmfl.js +4 -0
- package/static/dist/assets/dagre-lkoknbjn.js +1 -0
- package/static/dist/assets/dark-plus-kin19s9x.js +1 -0
- package/static/dist/assets/dart-nsg0xvqh.js +1 -0
- package/static/dist/assets/dax-f82777dv.js +1 -0
- package/static/dist/assets/defaultLocale-eeoev87l.js +1 -0
- package/static/dist/assets/desktop-nvg88bea.js +1 -0
- package/static/dist/assets/diagram-S7CK7UJ4-4z90agaz.js +30 -0
- package/static/dist/assets/diagram-UQ7AKVKN-eifw0lg7.js +41 -0
- package/static/dist/assets/diagram-VSXAHHWV-ksh3sjqv.js +3 -0
- package/static/dist/assets/diagram-VX7I27RA-ett72f71.js +24 -0
- package/static/dist/assets/diagram-Z3DM3KII-l8scp8nu.js +24 -0
- package/static/dist/assets/diff-c5xjoml2.js +1 -0
- package/static/dist/assets/dist-c4c2m3kv.js +1 -0
- package/static/dist/assets/docker-s0pf2u92.js +1 -0
- package/static/dist/assets/dotenv-d2gvqxc1.js +1 -0
- package/static/dist/assets/dracula-eicfho73.js +1 -0
- package/static/dist/assets/dracula-soft-doslejd2.js +1 -0
- package/static/dist/assets/dream-maker-mz8d3pqb.js +1 -0
- package/static/dist/assets/ebnfDiagram-PWID7BFC-f0pxcmit.js +1 -0
- package/static/dist/assets/edge-dvv35byi.js +1 -0
- package/static/dist/assets/elixir-i2f1ki1g.js +1 -0
- package/static/dist/assets/elm-cpepyjm4.js +1 -0
- package/static/dist/assets/emacs-lisp-lhl63kmy.js +1 -0
- package/static/dist/assets/endpoints-ipnv1hd4.js +64 -0
- package/static/dist/assets/erDiagram-RLTQ6QDP-f47m5xh0.js +99 -0
- package/static/dist/assets/erb-idlyfheg.js +1 -0
- package/static/dist/assets/erlang-kbk8e1kh.js +1 -0
- package/static/dist/assets/eventmodeling-NTZA5JFV-d9b5a0ia.js +1 -0
- package/static/dist/assets/everforest-dark-cv4maom7.js +1 -0
- package/static/dist/assets/everforest-light-njdw7fx6.js +1 -0
- package/static/dist/assets/fennel-mm8r79co.js +1 -0
- package/static/dist/assets/fish-em0xdaat.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-kfxxsyrk.js +1 -0
- package/static/dist/assets/fluent-kzq1mil2.js +1 -0
- package/static/dist/assets/fortran-fixed-form-lwddxd99.js +1 -0
- package/static/dist/assets/fortran-free-form-jao3bzvo.js +1 -0
- package/static/dist/assets/fsharp-ouam7w4k.js +1 -0
- package/static/dist/assets/ganttDiagram-EL5Y4UJY-bmktjdi0.js +292 -0
- package/static/dist/assets/gdresource-gawivel9.js +1 -0
- package/static/dist/assets/gdscript-kcamxf4c.js +1 -0
- package/static/dist/assets/gdshader-hx54new5.js +1 -0
- package/static/dist/assets/genie-i5n3m91v.js +1 -0
- package/static/dist/assets/gherkin-lxn181dy.js +1 -0
- package/static/dist/assets/git-commit-e6qgtuh5.js +1 -0
- package/static/dist/assets/git-rebase-d9lpfpbn.js +1 -0
- package/static/dist/assets/gitGraph-4MIJSDKK-j2ueg258.js +1 -0
- package/static/dist/assets/gitGraphDiagram-WWUBYQGX-ms6586v9.js +106 -0
- package/static/dist/assets/github-dark-default-m0qs6qki.js +1 -0
- package/static/dist/assets/github-dark-dimmed-g0vz4qee.js +1 -0
- package/static/dist/assets/github-dark-high-contrast-hugubo52.js +1 -0
- package/static/dist/assets/github-dark-ljlyim8s.js +1 -0
- package/static/dist/assets/github-light-default-fgfak5mv.js +1 -0
- package/static/dist/assets/github-light-high-contrast-hka6wb3r.js +1 -0
- package/static/dist/assets/github-light-jhyi45t4.js +1 -0
- package/static/dist/assets/gleam-ix1dym3g.js +1 -0
- package/static/dist/assets/glimmer-js-39i0urfb.js +1 -0
- package/static/dist/assets/glimmer-ts-gdtd6n73.js +1 -0
- package/static/dist/assets/glsl-o1djm5pp.js +1 -0
- package/static/dist/assets/gn-cbzhsgl9.js +1 -0
- package/static/dist/assets/gnuplot-dr8f9gvm.js +1 -0
- package/static/dist/assets/go-enhtrrw8.js +1 -0
- package/static/dist/assets/graphlib-mrng1xrk.js +1 -0
- package/static/dist/assets/graphql-kj6rz55t.js +1 -0
- package/static/dist/assets/groovy-jff59t9e.js +1 -0
- package/static/dist/assets/gruvbox-dark-hard-lgsj7y5r.js +1 -0
- package/static/dist/assets/gruvbox-dark-medium-ezt86wrc.js +1 -0
- package/static/dist/assets/gruvbox-dark-soft-1a3jfdlm.js +1 -0
- package/static/dist/assets/gruvbox-light-hard-d82lddjc.js +1 -0
- package/static/dist/assets/gruvbox-light-medium-d3ffitv3.js +1 -0
- package/static/dist/assets/gruvbox-light-soft-e5gf7i2q.js +1 -0
- package/static/dist/assets/hack-pe1qqr2i.js +1 -0
- package/static/dist/assets/haml-cknnbcqs.js +1 -0
- package/static/dist/assets/handlebars-hwq64orh.js +1 -0
- package/static/dist/assets/haskell-o7nor2z2.js +1 -0
- package/static/dist/assets/haxe-4rwdh42h.js +1 -0
- package/static/dist/assets/hcl-nnng763h.js +1 -0
- package/static/dist/assets/highlighted-body-KPVGNVTW-ev52d2si.js +1 -0
- package/static/dist/assets/hjson-kscwmuzk.js +1 -0
- package/static/dist/assets/hlsl-kopkvwox.js +1 -0
- package/static/dist/assets/horizon-bright-gn4aqinx.js +1 -0
- package/static/dist/assets/horizon-h5nzrwlb.js +1 -0
- package/static/dist/assets/houston-kifsbmbx.js +1 -0
- package/static/dist/assets/html-derivative-h2i2pyjc.js +1 -0
- package/static/dist/assets/html-ha05xtvt.js +1 -0
- package/static/dist/assets/http-cf94zu27.js +1 -0
- package/static/dist/assets/hurl-lslax568.js +1 -0
- package/static/dist/assets/hxml-g52gxet6.js +1 -0
- package/static/dist/assets/hy-jc9www1l.js +1 -0
- package/static/dist/assets/imba-n9x1ej2f.js +1 -0
- package/static/dist/assets/index-bz7g7rhx.css +2 -0
- package/static/dist/assets/index-hywfjw88.js +11 -0
- package/static/dist/assets/info-A6RAGUB7-j717vyt7.js +1 -0
- package/static/dist/assets/infoDiagram-27XIBGKW-dsbpib36.js +2 -0
- package/static/dist/assets/ini-hg6eosim.js +1 -0
- package/static/dist/assets/init-ljpdkjra.js +1 -0
- package/static/dist/assets/ishikawaDiagram-5VMMS53U-n0sz3i2d.js +70 -0
- package/static/dist/assets/java-ndjf2o89.js +1 -0
- package/static/dist/assets/javascript-coftlwy3.js +1 -0
- package/static/dist/assets/jinja-etei9wy7.js +1 -0
- package/static/dist/assets/jison-hyekgft1.js +1 -0
- package/static/dist/assets/journeyDiagram-3NMN7TZE-mcxz1mme.js +139 -0
- package/static/dist/assets/json-lok0yaho.js +1 -0
- package/static/dist/assets/json5-e4tr07tg.js +1 -0
- package/static/dist/assets/jsonc-jbmkhoep.js +1 -0
- package/static/dist/assets/jsonl-j35ke6at.js +1 -0
- package/static/dist/assets/jsonnet-iewuy86o.js +1 -0
- package/static/dist/assets/jssm-m1449zlc.js +1 -0
- package/static/dist/assets/jsx-b64w0nbx.js +1 -0
- package/static/dist/assets/jsx-runtime-eu92a5pu.js +1 -0
- package/static/dist/assets/julia-jxxzz2yn.js +1 -0
- package/static/dist/assets/just-mc29iw9t.js +1 -0
- package/static/dist/assets/kanagawa-dragon-i9mmmgud.js +1 -0
- package/static/dist/assets/kanagawa-lotus-ev5oro17.js +1 -0
- package/static/dist/assets/kanagawa-wave-i06560uw.js +1 -0
- package/static/dist/assets/kanban-definition-UXKFOSKX-n6hq2lyc.js +89 -0
- package/static/dist/assets/kdl-kgzv1x9e.js +1 -0
- package/static/dist/assets/kotlin-nmx05b3f.js +1 -0
- package/static/dist/assets/kusto-fawmdms4.js +1 -0
- package/static/dist/assets/laserwave-goebpayr.js +1 -0
- package/static/dist/assets/latex-pafa03ft.js +1 -0
- package/static/dist/assets/lazyRouteComponent-faquioun.js +1 -0
- package/static/dist/assets/lean-jom31nm3.js +1 -0
- package/static/dist/assets/less-mwvscr3d.js +1 -0
- package/static/dist/assets/light-plus-mws1g85f.js +1 -0
- package/static/dist/assets/line-h5xq20s4.js +1 -0
- package/static/dist/assets/linear-becwlnhk.js +1 -0
- package/static/dist/assets/link-ib4prsn5.js +1 -0
- package/static/dist/assets/liquid-hz5c2pov.js +1 -0
- package/static/dist/assets/llvm-j5wmr3g9.js +1 -0
- package/static/dist/assets/log-eur4gurm.js +1 -0
- package/static/dist/assets/login-mvjys1ol.js +1 -0
- package/static/dist/assets/logo-j3h8r0pu.js +1 -0
- package/static/dist/assets/lua-leyf8mlb.js +1 -0
- package/static/dist/assets/luau-im5d6q8k.js +1 -0
- package/static/dist/assets/make-npl27xqy.js +1 -0
- package/static/dist/assets/markdown-fibv6lrm.js +1 -0
- package/static/dist/assets/marko-cn1fzpdv.js +1 -0
- package/static/dist/assets/matchContext-f8oy3lo7.js +1 -0
- package/static/dist/assets/material-theme-darker-dhm8zmok.js +1 -0
- package/static/dist/assets/material-theme-gdimc61s.js +1 -0
- package/static/dist/assets/material-theme-lighter-c1fszbb2.js +1 -0
- package/static/dist/assets/material-theme-ocean-iakojpmy.js +1 -0
- package/static/dist/assets/material-theme-palenight-hgxmykmi.js +1 -0
- package/static/dist/assets/matlab-o6nvvbf2.js +1 -0
- package/static/dist/assets/mdc-huhy88df.js +1 -0
- package/static/dist/assets/mdx-mmgeh26h.js +1 -0
- package/static/dist/assets/mermaid-HWGCJPDP-gmnkgf1n.js +1 -0
- package/static/dist/assets/mermaid-f9ad87lb.js +1 -0
- package/static/dist/assets/mermaid-parser.core-n9cuu5ue.js +7 -0
- package/static/dist/assets/min-dark-e5sicuw2.js +1 -0
- package/static/dist/assets/min-light-gst87fvf.js +1 -0
- package/static/dist/assets/mindmap-definition-YA3MSWOX-gta3u7z4.js +96 -0
- package/static/dist/assets/mipsasm-etoqqos6.js +1 -0
- package/static/dist/assets/mojo-fyyk0b1z.js +1 -0
- package/static/dist/assets/monokai-jl389a9o.js +1 -0
- package/static/dist/assets/moonbit-je86hbgx.js +1 -0
- package/static/dist/assets/move-g7w7k042.js +1 -0
- package/static/dist/assets/narrat-d1cszt6i.js +1 -0
- package/static/dist/assets/nextflow-fpd3eqgm.js +1 -0
- package/static/dist/assets/nextflow-groovy-nc95p6pm.js +1 -0
- package/static/dist/assets/nginx-e7lvhsmn.js +1 -0
- package/static/dist/assets/night-owl-light-b2j1bc8t.js +1 -0
- package/static/dist/assets/night-owl-nm3cgqfv.js +1 -0
- package/static/dist/assets/nim-dun5d8mk.js +1 -0
- package/static/dist/assets/nix-sxazvl0w.js +1 -0
- package/static/dist/assets/nord-jiiendyo.js +1 -0
- package/static/dist/assets/not-found-ccnnac39.js +1 -0
- package/static/dist/assets/nushell-nbi9xmdg.js +1 -0
- package/static/dist/assets/objective-c-oshe4ycx.js +1 -0
- package/static/dist/assets/objective-cpp-go29ofq1.js +1 -0
- package/static/dist/assets/ocaml-56kivtnr.js +1 -0
- package/static/dist/assets/odin-g772bhi5.js +1 -0
- package/static/dist/assets/onboarding-l6quy6gz.js +1 -0
- package/static/dist/assets/one-dark-pro-ext74l87.js +1 -0
- package/static/dist/assets/one-light-o5mlsn8i.js +1 -0
- package/static/dist/assets/openscad-e9e9mfyg.js +1 -0
- package/static/dist/assets/ordinal-d88pfdla.js +1 -0
- package/static/dist/assets/packet-AYTQ26CC-bpzuq5n6.js +1 -0
- package/static/dist/assets/pascal-dmg2rs6d.js +1 -0
- package/static/dist/assets/passkeys-ktie3sr0.js +1 -0
- package/static/dist/assets/path-b509aej0.js +1 -0
- package/static/dist/assets/pegDiagram-XKGWAZYB-juye13e5.js +1 -0
- package/static/dist/assets/perl-bj3oqtet.js +1 -0
- package/static/dist/assets/php-buzp12r0.js +1 -0
- package/static/dist/assets/pie-WAS4IAKB-odhb8buq.js +1 -0
- package/static/dist/assets/pieDiagram-E7YTZNPT-mgb14ksh.js +39 -0
- package/static/dist/assets/pkl-co2grztk.js +1 -0
- package/static/dist/assets/plastic-mm7c7uq7.js +1 -0
- package/static/dist/assets/plsql-l0i9f33n.js +1 -0
- package/static/dist/assets/po-f3ga9osn.js +1 -0
- package/static/dist/assets/poimandres-mnwq5v4d.js +1 -0
- package/static/dist/assets/polar-ldicpe6g.js +1 -0
- package/static/dist/assets/postcss-fgpvnt75.js +1 -0
- package/static/dist/assets/powerquery-mflxo46x.js +1 -0
- package/static/dist/assets/powershell-oado4mxi.js +1 -0
- package/static/dist/assets/prepaint-f14kbd49.js +21 -0
- package/static/dist/assets/prisma-go1e7wq8.js +1 -0
- package/static/dist/assets/prolog-cbjal8aj.js +1 -0
- package/static/dist/assets/proto-lrhov7xc.js +1 -0
- package/static/dist/assets/pug-mjad7he9.js +1 -0
- package/static/dist/assets/puppet-h22szrmn.js +1 -0
- package/static/dist/assets/purescript-dwpj7hdb.js +1 -0
- package/static/dist/assets/python-b767fgue.js +1 -0
- package/static/dist/assets/qml-d1gdp10s.js +1 -0
- package/static/dist/assets/qmldir-lsawched.js +1 -0
- package/static/dist/assets/qss-lyvmg4f4.js +1 -0
- package/static/dist/assets/quadrantDiagram-AXDQQJYC-cg36naog.js +7 -0
- package/static/dist/assets/r-o3r9c7ao.js +1 -0
- package/static/dist/assets/racket-nbfqjw5h.js +1 -0
- package/static/dist/assets/radar-RG4KPBEZ-lgzfpnef.js +1 -0
- package/static/dist/assets/railroad-74A4TZTK-gmglc3ua.js +1 -0
- package/static/dist/assets/railroad-abnf-HS5TGJTU-5mjl5wpv.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-bfram8v8.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-nwfczn88.js +1 -0
- package/static/dist/assets/railroadDiagram-O6MQD6OU-cmxwjt73.js +1 -0
- package/static/dist/assets/raku-hcy6uwm6.js +1 -0
- package/static/dist/assets/razor-ilc585yr.js +1 -0
- package/static/dist/assets/red-if4jt303.js +1 -0
- package/static/dist/assets/refresh-cw-mf192q3f.js +1 -0
- package/static/dist/assets/reg-ivi9d1my.js +1 -0
- package/static/dist/assets/regexp-mpjtcvwm.js +1 -0
- package/static/dist/assets/rel-gqpkg3ta.js +1 -0
- package/static/dist/assets/requirementDiagram-BXWQKSXE-ir0s2mek.js +84 -0
- package/static/dist/assets/riscv-j1f2yjp2.js +1 -0
- package/static/dist/assets/rolldown-runtime-b9miacsj.js +1 -0
- package/static/dist/assets/ron-bjqasg78.js +1 -0
- package/static/dist/assets/root-mbklpuv4.js +1 -0
- package/static/dist/assets/rose-pine-dawn-nlpzqzob.js +1 -0
- package/static/dist/assets/rose-pine-grpwpg67.js +1 -0
- package/static/dist/assets/rose-pine-moon-b9yyevxr.js +1 -0
- package/static/dist/assets/rosmsg-hv3wcot6.js +1 -0
- package/static/dist/assets/rough.esm-on4k4je3.js +1 -0
- package/static/dist/assets/rst-jrkwjdyi.js +1 -0
- package/static/dist/assets/ruby-n4tjcbpz.js +1 -0
- package/static/dist/assets/rust-jqduclx1.js +1 -0
- package/static/dist/assets/sankeyDiagram-P5KCCOFB-jo7jcdq0.js +40 -0
- package/static/dist/assets/sas-hjo6y93k.js +1 -0
- package/static/dist/assets/sass-m1yncbwu.js +1 -0
- package/static/dist/assets/saved-g777hp1t.js +1 -0
- package/static/dist/assets/scala-l9ahg4e9.js +1 -0
- package/static/dist/assets/scheme-mlodf39l.js +1 -0
- package/static/dist/assets/scss-ncidjv48.js +1 -0
- package/static/dist/assets/sdbl-bwg2t5pt.js +1 -0
- package/static/dist/assets/search-i2kfogyx.js +1 -0
- package/static/dist/assets/sequenceDiagram-WJ2MYXX4-n0pf6xk5.js +162 -0
- package/static/dist/assets/settings_section_extensions_title-hgvh507l.js +1 -0
- package/static/dist/assets/shaderlab-be89ch6g.js +1 -0
- package/static/dist/assets/share._token-il3y6js2.js +2 -0
- package/static/dist/assets/shellscript-m8whjpqd.js +1 -0
- package/static/dist/assets/shellsession-i5bj6syz.js +1 -0
- package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +1 -0
- package/static/dist/assets/slack-dark-ny9l0r7b.js +1 -0
- package/static/dist/assets/slack-ochin-g98102hs.js +1 -0
- package/static/dist/assets/sliders-horizontal-kd99ffvl.js +1 -0
- package/static/dist/assets/smalltalk-g9lpwisn.js +1 -0
- package/static/dist/assets/snazzy-light-dlu9q2m5.js +1 -0
- package/static/dist/assets/solarized-dark-mx1nd4sm.js +1 -0
- package/static/dist/assets/solarized-light-mqzd33fz.js +1 -0
- package/static/dist/assets/solidity-ih313ji4.js +1 -0
- package/static/dist/assets/soy-hhh36ysq.js +1 -0
- package/static/dist/assets/sparql-pewjbauq.js +1 -0
- package/static/dist/assets/splunk-d8q89juf.js +1 -0
- package/static/dist/assets/sql-j21bzcl6.js +1 -0
- package/static/dist/assets/src-hjyib4mu.js +1 -0
- package/static/dist/assets/ssh-config-fzxlymn8.js +1 -0
- package/static/dist/assets/stata-bbu2onh1.js +1 -0
- package/static/dist/assets/stateDiagram-D77RDMKH-olbrwyv9.js +1 -0
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-dnzlmdpu.js +1 -0
- package/static/dist/assets/stylus-hifjg0ye.js +1 -0
- package/static/dist/assets/surrealql-l5vczuco.js +1 -0
- package/static/dist/assets/svelte-idn422g6.js +1 -0
- package/static/dist/assets/swift-n11rc3v3.js +1 -0
- package/static/dist/assets/swimlanes-42K2YHIH-od14zrw6.js +1 -0
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-ck0eqqdp.js +8 -0
- package/static/dist/assets/synthwave-84-clkt7319.js +1 -0
- package/static/dist/assets/system-verilog-l8k1po2l.js +1 -0
- package/static/dist/assets/systemd-d1zoxedb.js +1 -0
- package/static/dist/assets/talonscript-j9gt5qb1.js +1 -0
- package/static/dist/assets/tasl-meer3lyk.js +1 -0
- package/static/dist/assets/tcl-jdc54rsg.js +1 -0
- package/static/dist/assets/templ-e22qou3c.js +1 -0
- package/static/dist/assets/terraform-oav3wzsy.js +1 -0
- package/static/dist/assets/tex-deqpc5ee.js +1 -0
- package/static/dist/assets/timeline-definition-24CTP7MA-l0qokmnb.js +120 -0
- package/static/dist/assets/todoStore-la6uyqzj.js +1 -0
- package/static/dist/assets/tokyo-night-cnyqlmc2.js +1 -0
- package/static/dist/assets/toml-jj1ee1k1.js +1 -0
- package/static/dist/assets/trash-bxz1k9cw.js +1 -0
- package/static/dist/assets/treeView-Q6P3EWNA-hma3ip8m.js +1 -0
- package/static/dist/assets/treemap-WGGIJYW6-bghjng5m.js +1 -0
- package/static/dist/assets/ts-tags-ctnibc27.js +1 -0
- package/static/dist/assets/tsv-cxbgj4wh.js +1 -0
- package/static/dist/assets/tsx-i163n32g.js +1 -0
- package/static/dist/assets/turtle-g1kfgpwv.js +1 -0
- package/static/dist/assets/twig-x0fi7wm8.js +1 -0
- package/static/dist/assets/typescript-g18c34xz.js +1 -0
- package/static/dist/assets/typespec-hokgy7ic.js +1 -0
- package/static/dist/assets/typst-l6lt2vta.js +1 -0
- package/static/dist/assets/untitled-nfaw0q7m.js +1 -0
- package/static/dist/assets/useForm-k7fj2zsr.js +1 -0
- package/static/dist/assets/useLocale-evhacmv2.js +1 -0
- package/static/dist/assets/useParams-gpbjxj8s.js +1 -0
- package/static/dist/assets/useSearch-bhdptos7.js +1 -0
- package/static/dist/assets/useSelector-f2aak1ol.js +1 -0
- package/static/dist/assets/v-lwnsi8rl.js +1 -0
- package/static/dist/assets/vala-db1h2kp7.js +1 -0
- package/static/dist/assets/vb-nrezymby.js +1 -0
- package/static/dist/assets/vennDiagram-4TSXK5OY-bo97zf3z.js +34 -0
- package/static/dist/assets/verilog-jworpiw4.js +1 -0
- package/static/dist/assets/vesper-o1vwtlg2.js +1 -0
- package/static/dist/assets/vhdl-gnn4vfnm.js +1 -0
- package/static/dist/assets/viml-ogfqutxv.js +1 -0
- package/static/dist/assets/vitesse-black-b5y62t71.js +1 -0
- package/static/dist/assets/vitesse-dark-fj1ju380.js +1 -0
- package/static/dist/assets/vitesse-light-bjycd3ha.js +1 -0
- package/static/dist/assets/vue-html-nskj3du0.js +1 -0
- package/static/dist/assets/vue-mwu5l1bb.js +1 -0
- package/static/dist/assets/vue-vine-cqe77smq.js +1 -0
- package/static/dist/assets/vyper-jsmo764l.js +1 -0
- package/static/dist/assets/wardley-WFR3VGLG-pbjl6jav.js +1 -0
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-bmy9i09l.js +78 -0
- package/static/dist/assets/wasm-g1zrybde.js +1 -0
- package/static/dist/assets/wasm-gezzbmz0.js +1 -0
- package/static/dist/assets/wenyan-lgcd7t1n.js +1 -0
- package/static/dist/assets/wgsl-gotoh48n.js +1 -0
- package/static/dist/assets/wikitext-j1379ez7.js +1 -0
- package/static/dist/assets/wit-neu67rwu.js +1 -0
- package/static/dist/assets/wolfram-mbb1p6oi.js +1 -0
- package/static/dist/assets/xml-gau7gvrv.js +1 -0
- package/static/dist/assets/xsl-ew09zq8b.js +1 -0
- package/static/dist/assets/xychartDiagram-S5SC5T6Z-eercu0mc.js +7 -0
- package/static/dist/assets/yaml-ofnrxtvf.js +1 -0
- package/static/dist/assets/zenscript-ge1h0r83.js +1 -0
- package/static/dist/assets/zig-ik06evde.js +1 -0
- package/static/dist/extension-sdk.js +1 -0
- package/static/dist/index.html +1 -0
- package/static/dist/manifest.webmanifest +29 -0
- package/static/dist/sw.js +944 -0
|
@@ -0,0 +1,791 @@
|
|
|
1
|
+
"""``chat.*``, ``approval.*``, ``clarify.*``: one Agent turn per ``chat.start`` call.
|
|
2
|
+
|
|
3
|
+
The server owns the WebUI session (transcript merge, journals, SSE fan-out);
|
|
4
|
+
the sidecar owns the ``AIAgent`` instance. ``chat.start`` streams the Agent's
|
|
5
|
+
callbacks as frames and returns the settled result. Approval and clarify
|
|
6
|
+
prompts block the Agent thread until the server relays the user's answer
|
|
7
|
+
through ``approval.respond`` / ``clarify.respond``; ``rpc.cancel`` or
|
|
8
|
+
``chat.interrupt`` stop the turn (``api/streaming.py`` in the Python backend).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import contextlib
|
|
14
|
+
import hashlib
|
|
15
|
+
import inspect
|
|
16
|
+
import json
|
|
17
|
+
import logging
|
|
18
|
+
import threading
|
|
19
|
+
import time
|
|
20
|
+
import uuid
|
|
21
|
+
from collections import OrderedDict
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
from ..errors import InvalidParams, RpcError
|
|
25
|
+
from ..home import profile_home_param, scoped_home
|
|
26
|
+
from ..rpc import CallContext
|
|
27
|
+
|
|
28
|
+
log = logging.getLogger("talaria_sidecar.chat")
|
|
29
|
+
|
|
30
|
+
_AGENT_CACHE_MAX = 32
|
|
31
|
+
_TOOL_RESULT_SNIPPET_MAX = 4000
|
|
32
|
+
# Predecessor ``_TOOL_ARG_CONTENT_KEYS`` (#4928): card content / diff-reconstruction inputs keep the long cap.
|
|
33
|
+
_TOOL_ARG_CONTENT_KEYS = frozenset({"command", "cmd", "script", "code", "patch", "diff", "old_string", "new_string", "content", "path", "file_path"})
|
|
34
|
+
_CLARIFY_FALLBACK = "The user did not provide a response within the time limit. Use your best judgement to make the choice and proceed."
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class _Run:
|
|
38
|
+
def __init__(self, stream_id: str, session_id: str, ctx: CallContext):
|
|
39
|
+
self.stream_id = stream_id
|
|
40
|
+
self.session_id = session_id
|
|
41
|
+
self.ctx = ctx
|
|
42
|
+
self.agent = None
|
|
43
|
+
self.cancel = threading.Event()
|
|
44
|
+
# Set when the turn is over for any reason; the cancel watcher must not mistake it for a cancellation.
|
|
45
|
+
self.finished = threading.Event()
|
|
46
|
+
self.clarify_entries: dict[str, "_ClarifyEntry"] = {}
|
|
47
|
+
self.lock = threading.Lock()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class _ClarifyEntry:
|
|
51
|
+
def __init__(self, data: dict):
|
|
52
|
+
self.clarify_id = uuid.uuid4().hex
|
|
53
|
+
self.data = data
|
|
54
|
+
self.event = threading.Event()
|
|
55
|
+
self.result: str | None = None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
_RUNS: dict[str, _Run] = {}
|
|
59
|
+
_RUNS_BY_SESSION: dict[str, str] = {}
|
|
60
|
+
# Which run owns the Agent's gateway approval callback per session; register/unregister happen under one lock so a
|
|
61
|
+
# stale run can never remove a successor's callback, and a successor can never leak a predecessor's.
|
|
62
|
+
_APPROVAL_CB_OWNER: dict[str, str] = {}
|
|
63
|
+
_APPROVAL_CB_LOCK = threading.Lock()
|
|
64
|
+
_RUNS_LOCK = threading.Lock()
|
|
65
|
+
_AGENT_CACHE: "OrderedDict[str, tuple[Any, str]]" = OrderedDict()
|
|
66
|
+
_AGENT_CACHE_LOCK = threading.Lock()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _snippet(raw: Any, limit: int = _TOOL_RESULT_SNIPPET_MAX) -> str:
|
|
70
|
+
"""Predecessor ``_tool_result_snippet``: the ``output``/``result``/``error`` of a dict (or JSON) result, hard-cut."""
|
|
71
|
+
if limit <= 0:
|
|
72
|
+
return ""
|
|
73
|
+
text = str(raw or "")
|
|
74
|
+
try:
|
|
75
|
+
data = raw if isinstance(raw, dict) else json.loads(text)
|
|
76
|
+
if isinstance(data, dict):
|
|
77
|
+
preview = data.get("output") or data.get("result") or data.get("error") or text
|
|
78
|
+
text = str(preview)
|
|
79
|
+
except Exception: # noqa: BLE001
|
|
80
|
+
pass
|
|
81
|
+
return text[:limit]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _delegation_cost_usd(name: Any, raw: Any):
|
|
85
|
+
"""Predecessor ``_delegation_cost_usd``: total spend a ``delegate_task`` result reports, or None."""
|
|
86
|
+
if str(name or "") != "delegate_task":
|
|
87
|
+
return None
|
|
88
|
+
try:
|
|
89
|
+
data = raw if isinstance(raw, dict) else json.loads(str(raw or ""))
|
|
90
|
+
except Exception: # noqa: BLE001
|
|
91
|
+
return None
|
|
92
|
+
if not isinstance(data, dict):
|
|
93
|
+
return None
|
|
94
|
+
results = data.get("results")
|
|
95
|
+
if not isinstance(results, list):
|
|
96
|
+
return None
|
|
97
|
+
total = 0.0
|
|
98
|
+
for entry in results:
|
|
99
|
+
if not isinstance(entry, dict):
|
|
100
|
+
continue
|
|
101
|
+
if str(entry.get("cost_status") or "").strip().lower() == "unknown":
|
|
102
|
+
return None
|
|
103
|
+
value = entry.get("cost_usd")
|
|
104
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)):
|
|
105
|
+
continue
|
|
106
|
+
if not (0 < value < 1e12):
|
|
107
|
+
continue
|
|
108
|
+
total += float(value)
|
|
109
|
+
return round(total, 6) if total > 0 else None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _args_snapshot(args: Any) -> dict:
|
|
113
|
+
snap: dict = {}
|
|
114
|
+
if isinstance(args, dict):
|
|
115
|
+
for k, v in list(args.items())[:4]:
|
|
116
|
+
s2 = str(v)
|
|
117
|
+
cap = _TOOL_RESULT_SNIPPET_MAX if str(k).lower() in _TOOL_ARG_CONTENT_KEYS else 120
|
|
118
|
+
snap[k] = s2[:cap] + ("..." if len(s2) > cap else "")
|
|
119
|
+
return snap
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _usage(agent: Any) -> dict:
|
|
123
|
+
def _num(name: str):
|
|
124
|
+
value = getattr(agent, name, None)
|
|
125
|
+
return value if isinstance(value, (int, float)) else 0
|
|
126
|
+
|
|
127
|
+
cost = getattr(agent, "session_estimated_cost_usd", None)
|
|
128
|
+
return {
|
|
129
|
+
"prompt_tokens": int(_num("session_prompt_tokens")),
|
|
130
|
+
"completion_tokens": int(_num("session_completion_tokens")),
|
|
131
|
+
"cache_read_tokens": int(_num("session_cache_read_tokens")),
|
|
132
|
+
"cache_write_tokens": int(_num("session_cache_write_tokens")),
|
|
133
|
+
"estimated_cost_usd": float(cost) if isinstance(cost, (int, float)) else None,
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _context_length(agent: Any) -> dict:
|
|
138
|
+
cc = getattr(agent, "context_compressor", None)
|
|
139
|
+
if cc is None:
|
|
140
|
+
return {}
|
|
141
|
+
out = {}
|
|
142
|
+
for key in ("context_length", "threshold_tokens", "last_prompt_tokens", "compression_count"):
|
|
143
|
+
value = getattr(cc, key, None)
|
|
144
|
+
if isinstance(value, (int, float)):
|
|
145
|
+
out[key] = int(value)
|
|
146
|
+
return out
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _clarify_timeout(params: dict) -> int:
|
|
150
|
+
"""Predecessor ``_clarify_timeout_seconds``: an explicit request value wins, else the Agent's resolver over config."""
|
|
151
|
+
explicit = params.get("clarify_timeout_seconds")
|
|
152
|
+
if explicit is not None:
|
|
153
|
+
try:
|
|
154
|
+
return int(explicit)
|
|
155
|
+
except (TypeError, ValueError):
|
|
156
|
+
pass
|
|
157
|
+
try:
|
|
158
|
+
from tools.clarify_gateway import get_clarify_timeout
|
|
159
|
+
|
|
160
|
+
return int(get_clarify_timeout())
|
|
161
|
+
except Exception: # noqa: BLE001 - older Agent without the resolver
|
|
162
|
+
pass
|
|
163
|
+
try:
|
|
164
|
+
from hermes_cli.config import load_config
|
|
165
|
+
|
|
166
|
+
cfg = load_config() or {}
|
|
167
|
+
raw = (cfg.get("clarify") or {}).get("timeout")
|
|
168
|
+
if raw is None:
|
|
169
|
+
raw = (cfg.get("agent") or {}).get("clarify_timeout", 3600)
|
|
170
|
+
return int(raw)
|
|
171
|
+
except Exception: # noqa: BLE001
|
|
172
|
+
return 3600
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _agent_pending_steer_text(agent) -> str:
|
|
176
|
+
"""Predecessor ``_agent_pending_steer_text``: the Agent's not-yet-applied steer text."""
|
|
177
|
+
lock = agent.__dict__.get("_pending_steer_lock") if hasattr(agent, "__dict__") else None
|
|
178
|
+
if lock is None:
|
|
179
|
+
return str(getattr(agent, "_pending_steer", "") or "")
|
|
180
|
+
with lock:
|
|
181
|
+
return str(agent.__dict__.get("_pending_steer") or "")
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _resolve_runtime(provider: str | None, model: str) -> dict:
|
|
185
|
+
try:
|
|
186
|
+
from hermes_cli.runtime_provider import resolve_runtime_provider
|
|
187
|
+
except Exception as exc: # noqa: BLE001
|
|
188
|
+
raise RpcError(f"runtime provider unavailable: {exc}", condition="providers_unavailable") from exc
|
|
189
|
+
try:
|
|
190
|
+
runtime = resolve_runtime_provider(requested=provider or None, target_model=model or None)
|
|
191
|
+
except Exception as exc: # noqa: BLE001
|
|
192
|
+
raise RpcError(str(exc), condition="credential_missing", data={"error_type": type(exc).__name__}) from exc
|
|
193
|
+
if not isinstance(runtime, dict):
|
|
194
|
+
runtime = dict(vars(runtime)) if hasattr(runtime, "__dict__") else {}
|
|
195
|
+
return runtime
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@contextlib.contextmanager
|
|
199
|
+
def _turn_identity(session_id: str, workspace: str):
|
|
200
|
+
"""Bind this turn's identity to the calling context the way the predecessor's ``_set_turn_session_identity`` did:
|
|
201
|
+
the approval session key (so ``register_gateway_notify`` cards reach this turn and dangerous commands are gated
|
|
202
|
+
instead of auto-approved), the gateway session vars (platform ``webui``, chat/ui session ids), and the session cwd
|
|
203
|
+
(so terminals and AGENTS.md discovery run in the selected workspace, not the sidecar's launch directory). Every
|
|
204
|
+
binding is a context variable, so concurrent turns cannot overwrite each other. Missing Agent surfaces are logged,
|
|
205
|
+
not fatal."""
|
|
206
|
+
resets: list = []
|
|
207
|
+
try:
|
|
208
|
+
try:
|
|
209
|
+
from tools.approval_context import reset_current_session_key, set_current_session_key
|
|
210
|
+
except ImportError:
|
|
211
|
+
from tools.approval import reset_current_session_key, set_current_session_key # type: ignore[no-redef]
|
|
212
|
+
token = set_current_session_key(session_id)
|
|
213
|
+
resets.append(lambda: reset_current_session_key(token))
|
|
214
|
+
except Exception: # noqa: BLE001
|
|
215
|
+
log.debug("per-turn approval session-key bind failed", exc_info=True)
|
|
216
|
+
try:
|
|
217
|
+
from gateway import session_context as sc
|
|
218
|
+
|
|
219
|
+
pairs = [
|
|
220
|
+
(sc._SESSION_KEY, session_id), (sc._SESSION_UI_SESSION_ID, session_id), (sc._SESSION_PLATFORM, "webui"),
|
|
221
|
+
(sc._SESSION_CHAT_ID, session_id), (sc._SESSION_ID, session_id),
|
|
222
|
+
]
|
|
223
|
+
for var, value in pairs:
|
|
224
|
+
tok = var.set(value)
|
|
225
|
+
resets.append(lambda var=var, tok=tok: var.reset(tok))
|
|
226
|
+
except Exception: # noqa: BLE001
|
|
227
|
+
log.debug("per-turn session context bind failed", exc_info=True)
|
|
228
|
+
try:
|
|
229
|
+
from agent.runtime_cwd import _SESSION_CWD
|
|
230
|
+
|
|
231
|
+
tok = _SESSION_CWD.set(str(workspace))
|
|
232
|
+
resets.append(lambda: _SESSION_CWD.reset(tok))
|
|
233
|
+
except Exception: # noqa: BLE001
|
|
234
|
+
log.debug("per-turn session cwd bind failed", exc_info=True)
|
|
235
|
+
try:
|
|
236
|
+
yield
|
|
237
|
+
finally:
|
|
238
|
+
for reset in reversed(resets):
|
|
239
|
+
try:
|
|
240
|
+
reset()
|
|
241
|
+
except Exception: # noqa: BLE001
|
|
242
|
+
log.debug("per-turn identity reset failed", exc_info=True)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _agent_signature(model: str, provider, runtime: dict, toolsets, home: str, kwargs: dict) -> str:
|
|
246
|
+
"""Cache identity of an ``AIAgent``: everything its constructor bound from the resolved runtime, so a rotated key,
|
|
247
|
+
a different API mode, ACP command, or credential pool never reuses an agent built for the old bundle. The key
|
|
248
|
+
itself only enters as a digest."""
|
|
249
|
+
api_key = runtime.get("api_key")
|
|
250
|
+
key_digest = hashlib.sha256(str(api_key).encode("utf-8")).hexdigest()[:16] if api_key else None
|
|
251
|
+
pool = runtime.get("credential_pool")
|
|
252
|
+
pool_identity = pool if isinstance(pool, (str, int, float, bool, list, dict)) or pool is None else f"{type(pool).__name__}:{getattr(pool, 'name', None) or getattr(pool, 'provider', None) or id(pool)}"
|
|
253
|
+
bundle = {
|
|
254
|
+
"model": model, "provider": provider, "base_url": runtime.get("base_url"), "api_key": key_digest,
|
|
255
|
+
"api_mode": runtime.get("api_mode"), "acp_command": runtime.get("acp_command"), "acp_args": runtime.get("acp_args"),
|
|
256
|
+
"credential_pool": pool_identity, "toolsets": toolsets, "home": home,
|
|
257
|
+
"max_iterations": kwargs.get("max_iterations"), "max_tokens": kwargs.get("max_tokens"),
|
|
258
|
+
# Bound at construction too: a reasoning-effort change from the composer must build a fresh agent.
|
|
259
|
+
"reasoning_config": kwargs.get("reasoning_config"),
|
|
260
|
+
}
|
|
261
|
+
return json.dumps(bundle, sort_keys=True, default=str)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def _evict_idle_agents_locked() -> None:
|
|
265
|
+
"""Trim the agent LRU (caller holds ``_AGENT_CACHE_LOCK``), never dropping a session whose turn is still running."""
|
|
266
|
+
if len(_AGENT_CACHE) <= _AGENT_CACHE_MAX:
|
|
267
|
+
return
|
|
268
|
+
with _RUNS_LOCK:
|
|
269
|
+
live = {sid for sid, sid_stream in _RUNS_BY_SESSION.items() if (r := _RUNS.get(sid_stream)) is not None and not r.finished.is_set()}
|
|
270
|
+
for sid in list(_AGENT_CACHE):
|
|
271
|
+
if len(_AGENT_CACHE) <= _AGENT_CACHE_MAX:
|
|
272
|
+
break
|
|
273
|
+
if sid not in live:
|
|
274
|
+
_AGENT_CACHE.pop(sid, None)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def evict_all_agents() -> int:
|
|
278
|
+
"""Drop every cached agent (credentials or environment changed underneath them)."""
|
|
279
|
+
with _AGENT_CACHE_LOCK:
|
|
280
|
+
count = len(_AGENT_CACHE)
|
|
281
|
+
_AGENT_CACHE.clear()
|
|
282
|
+
return count
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _agent_class():
|
|
286
|
+
try:
|
|
287
|
+
from run_agent import AIAgent
|
|
288
|
+
except Exception as exc: # noqa: BLE001
|
|
289
|
+
raise RpcError(f"AIAgent unavailable: {exc}", condition="agent_unavailable") from exc
|
|
290
|
+
return AIAgent
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def _supported(cls, name: str) -> bool:
|
|
294
|
+
"""Whether ``cls.__init__`` accepts ``name`` (named, or through ``**kwargs``)."""
|
|
295
|
+
try:
|
|
296
|
+
parameters = inspect.signature(cls.__init__).parameters
|
|
297
|
+
except (TypeError, ValueError):
|
|
298
|
+
return False
|
|
299
|
+
return name in parameters or any(p.kind is inspect.Parameter.VAR_KEYWORD for p in parameters.values())
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def start(ctx: CallContext, params: dict) -> dict: # noqa: PLR0915 - one turn, one function
|
|
303
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
304
|
+
stream_id = str(params.get("stream_id") or "").strip()
|
|
305
|
+
if not session_id or not stream_id:
|
|
306
|
+
raise InvalidParams("session_id and stream_id are required")
|
|
307
|
+
user_message = params.get("user_message")
|
|
308
|
+
if not (isinstance(user_message, str) and user_message.strip()) and not (isinstance(user_message, list) and user_message):
|
|
309
|
+
raise InvalidParams("user_message is required")
|
|
310
|
+
model = str(params.get("model") or "").strip()
|
|
311
|
+
provider = str(params.get("model_provider") or "").strip() or None
|
|
312
|
+
history = params.get("conversation_history")
|
|
313
|
+
if history is None:
|
|
314
|
+
history = []
|
|
315
|
+
if not isinstance(history, list):
|
|
316
|
+
raise InvalidParams("conversation_history must be a list")
|
|
317
|
+
toolsets = params.get("enabled_toolsets")
|
|
318
|
+
system_message = params.get("system_message")
|
|
319
|
+
run = _Run(stream_id, session_id, ctx)
|
|
320
|
+
with _RUNS_LOCK:
|
|
321
|
+
prior = _RUNS.get(_RUNS_BY_SESSION.get(session_id) or "")
|
|
322
|
+
# A previous turn for this session that never returned (a tool ignoring its interrupt) still owns the cached
|
|
323
|
+
# agent; this turn must not share, rebind, or un-interrupt that live instance.
|
|
324
|
+
session_busy = prior is not None and not prior.finished.is_set()
|
|
325
|
+
_RUNS[stream_id] = run
|
|
326
|
+
_RUNS_BY_SESSION[session_id] = stream_id
|
|
327
|
+
raw_emit = ctx.emit
|
|
328
|
+
steer_state = {"last": None}
|
|
329
|
+
|
|
330
|
+
def emit(event, data=None):
|
|
331
|
+
"""Predecessor ``_webui_steer_events_before``: before content frames, report the Agent's pending steer text
|
|
332
|
+
whenever it changed so the server can mark consumed steers live rather than only after ``done``."""
|
|
333
|
+
if event in ("token", "reasoning", "interim_assistant", "tool", "tool_complete") and run.agent is not None:
|
|
334
|
+
pending = _agent_pending_steer_text(run.agent)
|
|
335
|
+
if pending != steer_state["last"]:
|
|
336
|
+
steer_state["last"] = pending
|
|
337
|
+
raw_emit("steer_pending", {"text": pending})
|
|
338
|
+
raw_emit(event, data)
|
|
339
|
+
try:
|
|
340
|
+
runtime = _resolve_runtime(provider, model)
|
|
341
|
+
resolved_model = model or str(runtime.get("model") or "")
|
|
342
|
+
resolved_provider = provider or runtime.get("provider")
|
|
343
|
+
AIAgent = _agent_class()
|
|
344
|
+
live_tool_calls: list[dict] = []
|
|
345
|
+
started_ids: set[str] = set()
|
|
346
|
+
completed_ids: set[str] = set()
|
|
347
|
+
token_sent = [False]
|
|
348
|
+
|
|
349
|
+
def on_token(text):
|
|
350
|
+
if text is None:
|
|
351
|
+
return
|
|
352
|
+
token_sent[0] = True
|
|
353
|
+
emit("token", {"text": str(text)})
|
|
354
|
+
|
|
355
|
+
def on_reasoning(text):
|
|
356
|
+
if text is None:
|
|
357
|
+
return
|
|
358
|
+
emit("reasoning", {"text": str(text)})
|
|
359
|
+
|
|
360
|
+
def on_interim(text, **kw):
|
|
361
|
+
visible = str(text or "").strip()
|
|
362
|
+
if not visible:
|
|
363
|
+
return
|
|
364
|
+
emit("interim_assistant", {"text": visible, "already_streamed": bool(kw.get("already_streamed", False))})
|
|
365
|
+
|
|
366
|
+
def on_tool_start(tool_call_id, name, args):
|
|
367
|
+
tid = str(tool_call_id or "")
|
|
368
|
+
if tid and tid in started_ids:
|
|
369
|
+
return
|
|
370
|
+
if tid:
|
|
371
|
+
started_ids.add(tid)
|
|
372
|
+
live_tool_calls.append({"name": name, "args": args if isinstance(args, dict) else {}, "tid": tid, "done": False})
|
|
373
|
+
emit("tool", {"event_type": "tool.started", "name": name, "preview": None, "args": _args_snapshot(args), "tid": tid})
|
|
374
|
+
|
|
375
|
+
def on_tool_complete(tool_call_id, name, args, function_result):
|
|
376
|
+
tid = str(tool_call_id or "")
|
|
377
|
+
if tid and tid in completed_ids:
|
|
378
|
+
return
|
|
379
|
+
if tid:
|
|
380
|
+
completed_ids.add(tid)
|
|
381
|
+
snippet = _snippet(function_result)
|
|
382
|
+
for call in reversed(live_tool_calls):
|
|
383
|
+
if call.get("done"):
|
|
384
|
+
continue
|
|
385
|
+
if call.get("tid") == tid or (not call.get("tid") and call.get("name") == name):
|
|
386
|
+
call["done"] = True
|
|
387
|
+
call["snippet"] = snippet
|
|
388
|
+
break
|
|
389
|
+
payload = {"event_type": "tool.completed", "name": name, "preview": snippet, "args": _args_snapshot(args), "tid": tid, "is_error": False}
|
|
390
|
+
cost = _delegation_cost_usd(name, function_result)
|
|
391
|
+
if cost is not None:
|
|
392
|
+
payload["cost_usd"] = cost
|
|
393
|
+
for call in reversed(live_tool_calls):
|
|
394
|
+
if call.get("tid") == tid:
|
|
395
|
+
call["cost_usd"] = cost
|
|
396
|
+
break
|
|
397
|
+
emit("tool_complete", payload)
|
|
398
|
+
|
|
399
|
+
def on_tool(*cb_args, **cb_kwargs):
|
|
400
|
+
# Structured callbacks carry tool cards; the progress callback only feeds reasoning text on older builds.
|
|
401
|
+
if len(cb_args) >= 3 and cb_args[0] in ("reasoning.available", "_thinking"):
|
|
402
|
+
text = cb_args[2] if cb_args[0] == "reasoning.available" else cb_args[1]
|
|
403
|
+
if text:
|
|
404
|
+
emit("reasoning", {"text": str(text)})
|
|
405
|
+
|
|
406
|
+
def on_status(kind, message):
|
|
407
|
+
text = str(message or "").strip()
|
|
408
|
+
if not text:
|
|
409
|
+
return
|
|
410
|
+
lower = text.lower()
|
|
411
|
+
if "compress" in lower and ("start" in lower or "compressing" in lower):
|
|
412
|
+
emit("compressing", {"session_id": session_id, "message": "Compressing context"})
|
|
413
|
+
elif "fallback" in lower or "rate limit" in lower or "retry" in lower:
|
|
414
|
+
emit("warning", {"type": "fallback", "message": text})
|
|
415
|
+
elif "non-retryable error" in lower:
|
|
416
|
+
emit("status", {"kind": "terminal_error", "message": text})
|
|
417
|
+
|
|
418
|
+
def clarify_callback(question, choices, questions=None):
|
|
419
|
+
choices_list = [str(c) for c in (choices or [])]
|
|
420
|
+
# Predecessor `_clarify_timeout_seconds`: the Agent's own resolver over this profile's config
|
|
421
|
+
# (``clarify.timeout`` else ``agent.clarify_timeout`` else 3600); ``<= 0`` waits until answered or cancelled.
|
|
422
|
+
# The advertised ``timeout_seconds`` is what the clients count down, so it is the same number.
|
|
423
|
+
timeout = _clarify_timeout(params)
|
|
424
|
+
data = {"question": str(question or ""), "choices_offered": choices_list, "session_id": session_id, "kind": "clarify", "requested_at": time.time(), "timeout_seconds": timeout}
|
|
425
|
+
if isinstance(questions, list) and questions:
|
|
426
|
+
data["questions"] = questions
|
|
427
|
+
entry = _ClarifyEntry(data)
|
|
428
|
+
entry.data["clarify_id"] = entry.clarify_id
|
|
429
|
+
with run.lock:
|
|
430
|
+
run.clarify_entries[entry.clarify_id] = entry
|
|
431
|
+
emit("clarify", dict(entry.data))
|
|
432
|
+
deadline = None if timeout <= 0 else time.monotonic() + float(timeout)
|
|
433
|
+
while not entry.event.is_set():
|
|
434
|
+
if run.cancel.is_set() or run.finished.is_set():
|
|
435
|
+
break
|
|
436
|
+
if deadline is None:
|
|
437
|
+
entry.event.wait(1.0)
|
|
438
|
+
continue
|
|
439
|
+
remaining = deadline - time.monotonic()
|
|
440
|
+
if remaining <= 0:
|
|
441
|
+
break
|
|
442
|
+
entry.event.wait(min(1.0, remaining))
|
|
443
|
+
with run.lock:
|
|
444
|
+
run.clarify_entries.pop(entry.clarify_id, None)
|
|
445
|
+
emit("clarify_resolved", {"clarify_id": entry.clarify_id, "session_id": session_id})
|
|
446
|
+
return entry.result or _CLARIFY_FALLBACK
|
|
447
|
+
|
|
448
|
+
# Approval bridge: the Agent parks dangerous commands in its gateway queue and calls back here.
|
|
449
|
+
try:
|
|
450
|
+
from tools.approval import register_gateway_notify, unregister_gateway_notify
|
|
451
|
+
except Exception: # noqa: BLE001
|
|
452
|
+
register_gateway_notify = unregister_gateway_notify = None
|
|
453
|
+
if register_gateway_notify is not None:
|
|
454
|
+
def _approval_cb(data):
|
|
455
|
+
payload = dict(data or {})
|
|
456
|
+
payload.setdefault("session_id", session_id)
|
|
457
|
+
payload.setdefault("approval_id", str(payload.get("request_id") or uuid.uuid4().hex))
|
|
458
|
+
emit("approval", payload)
|
|
459
|
+
approval_cb = _approval_cb
|
|
460
|
+
else:
|
|
461
|
+
approval_cb = None
|
|
462
|
+
|
|
463
|
+
kwargs: dict = dict(
|
|
464
|
+
model=resolved_model,
|
|
465
|
+
provider=resolved_provider,
|
|
466
|
+
base_url=runtime.get("base_url"),
|
|
467
|
+
api_key=runtime.get("api_key"),
|
|
468
|
+
platform="webui",
|
|
469
|
+
quiet_mode=True,
|
|
470
|
+
enabled_toolsets=toolsets if isinstance(toolsets, list) else None,
|
|
471
|
+
session_id=session_id,
|
|
472
|
+
stream_delta_callback=on_token,
|
|
473
|
+
reasoning_callback=on_reasoning,
|
|
474
|
+
tool_progress_callback=on_tool,
|
|
475
|
+
clarify_callback=clarify_callback,
|
|
476
|
+
)
|
|
477
|
+
for name, value in (
|
|
478
|
+
("interim_assistant_callback", on_interim),
|
|
479
|
+
("tool_start_callback", on_tool_start),
|
|
480
|
+
("tool_complete_callback", on_tool_complete),
|
|
481
|
+
("status_callback", on_status),
|
|
482
|
+
("api_mode", runtime.get("api_mode")),
|
|
483
|
+
("acp_command", runtime.get("acp_command")),
|
|
484
|
+
("acp_args", runtime.get("acp_args")),
|
|
485
|
+
("credential_pool", runtime.get("credential_pool")),
|
|
486
|
+
("gateway_session_key", session_id),
|
|
487
|
+
):
|
|
488
|
+
if _supported(AIAgent, name) and value is not None:
|
|
489
|
+
kwargs[name] = value
|
|
490
|
+
if isinstance(params.get("max_iterations"), int) and params["max_iterations"] > 0 and _supported(AIAgent, "max_iterations"):
|
|
491
|
+
kwargs["max_iterations"] = params["max_iterations"]
|
|
492
|
+
if isinstance(params.get("max_tokens"), int) and params["max_tokens"] > 0 and _supported(AIAgent, "max_tokens"):
|
|
493
|
+
kwargs["max_tokens"] = params["max_tokens"]
|
|
494
|
+
# Predecessor: `agent.reasoning_effort` (already coerced for the model) → AIAgent ``reasoning_config``.
|
|
495
|
+
reasoning_config = params.get("reasoning_config")
|
|
496
|
+
if isinstance(reasoning_config, dict) and _supported(AIAgent, "reasoning_config"):
|
|
497
|
+
kwargs["reasoning_config"] = reasoning_config
|
|
498
|
+
signature = _agent_signature(resolved_model, resolved_provider, runtime, toolsets, str(params.get("profile_home")), kwargs)
|
|
499
|
+
agent = None
|
|
500
|
+
if not session_busy:
|
|
501
|
+
with _AGENT_CACHE_LOCK:
|
|
502
|
+
cached = _AGENT_CACHE.get(session_id)
|
|
503
|
+
if cached and cached[1] == signature:
|
|
504
|
+
agent = cached[0]
|
|
505
|
+
_AGENT_CACHE.move_to_end(session_id)
|
|
506
|
+
if agent is not None:
|
|
507
|
+
for name in ("stream_delta_callback", "reasoning_callback", "tool_progress_callback", "clarify_callback", "interim_assistant_callback", "tool_start_callback", "tool_complete_callback", "status_callback"):
|
|
508
|
+
if name in kwargs and hasattr(agent, name):
|
|
509
|
+
setattr(agent, name, kwargs[name])
|
|
510
|
+
else:
|
|
511
|
+
agent = AIAgent(**kwargs)
|
|
512
|
+
with _AGENT_CACHE_LOCK:
|
|
513
|
+
_AGENT_CACHE[session_id] = (agent, signature)
|
|
514
|
+
_AGENT_CACHE.move_to_end(session_id)
|
|
515
|
+
_evict_idle_agents_locked()
|
|
516
|
+
# Predecessor ``agent.ephemeral_system_prompt``: personality, surface context, progress guidance, and delivery
|
|
517
|
+
# hints travel as runtime instructions that are never persisted to history.
|
|
518
|
+
ephemeral = params.get("ephemeral_system_prompt")
|
|
519
|
+
if isinstance(ephemeral, str) and ephemeral.strip():
|
|
520
|
+
try:
|
|
521
|
+
agent.ephemeral_system_prompt = ephemeral
|
|
522
|
+
except Exception: # noqa: BLE001 - read-only stand-ins
|
|
523
|
+
pass
|
|
524
|
+
if approval_cb is not None:
|
|
525
|
+
with _APPROVAL_CB_LOCK:
|
|
526
|
+
register_gateway_notify(session_id, approval_cb)
|
|
527
|
+
_APPROVAL_CB_OWNER[session_id] = stream_id
|
|
528
|
+
run.agent = agent
|
|
529
|
+
compressions_before = int(getattr(getattr(agent, "context_compressor", None), "compression_count", 0) or 0)
|
|
530
|
+
|
|
531
|
+
# A cached agent may still carry the interrupt a previous cancel left behind; the Agent keeps a pending
|
|
532
|
+
# interrupt across turn start, so it would abort this turn immediately.
|
|
533
|
+
clear_interrupt = getattr(agent, "clear_interrupt", None)
|
|
534
|
+
if callable(clear_interrupt):
|
|
535
|
+
try:
|
|
536
|
+
clear_interrupt()
|
|
537
|
+
except Exception: # noqa: BLE001
|
|
538
|
+
log.debug("agent.clear_interrupt failed", exc_info=True)
|
|
539
|
+
|
|
540
|
+
def _watch_cancel():
|
|
541
|
+
while not run.cancel.wait(0.25):
|
|
542
|
+
if run.finished.is_set():
|
|
543
|
+
return
|
|
544
|
+
if ctx.cancelled:
|
|
545
|
+
run.cancel.set()
|
|
546
|
+
break
|
|
547
|
+
if run.finished.is_set() and not run.cancel.is_set():
|
|
548
|
+
return
|
|
549
|
+
try:
|
|
550
|
+
agent.interrupt("Cancelled by user", hard_cancel=True)
|
|
551
|
+
except TypeError:
|
|
552
|
+
agent.interrupt("Cancelled by user")
|
|
553
|
+
except Exception: # noqa: BLE001
|
|
554
|
+
log.debug("agent.interrupt failed", exc_info=True)
|
|
555
|
+
with run.lock:
|
|
556
|
+
for entry in list(run.clarify_entries.values()):
|
|
557
|
+
entry.event.set()
|
|
558
|
+
|
|
559
|
+
watcher = threading.Thread(target=_watch_cancel, daemon=True, name=f"chat-cancel-{stream_id[:8]}")
|
|
560
|
+
watcher.start()
|
|
561
|
+
run_kwargs: dict = {"user_message": user_message, "conversation_history": history, "task_id": session_id}
|
|
562
|
+
try:
|
|
563
|
+
run_params = set(inspect.signature(agent.run_conversation).parameters)
|
|
564
|
+
except (TypeError, ValueError):
|
|
565
|
+
run_params = set()
|
|
566
|
+
if system_message and ("system_message" in run_params or not run_params):
|
|
567
|
+
run_kwargs["system_message"] = system_message
|
|
568
|
+
if "persist_user_message" in run_params and isinstance(user_message, str):
|
|
569
|
+
run_kwargs["persist_user_message"] = user_message
|
|
570
|
+
error: str | None = None
|
|
571
|
+
result: dict = {}
|
|
572
|
+
try:
|
|
573
|
+
raw = agent.run_conversation(**run_kwargs)
|
|
574
|
+
result = raw if isinstance(raw, dict) else {}
|
|
575
|
+
except Exception as exc: # noqa: BLE001
|
|
576
|
+
log.warning("agent turn failed for %s: %s", session_id, exc)
|
|
577
|
+
error = f"{type(exc).__name__}: {exc}"
|
|
578
|
+
finally:
|
|
579
|
+
run.finished.set()
|
|
580
|
+
watcher.join(timeout=2)
|
|
581
|
+
# A successor turn for the same session (admitted past the cancel-unwind ceiling) may have registered
|
|
582
|
+
# its own callback meanwhile: compare-and-unregister under the same lock registration takes.
|
|
583
|
+
if unregister_gateway_notify is not None:
|
|
584
|
+
with _APPROVAL_CB_LOCK:
|
|
585
|
+
if _APPROVAL_CB_OWNER.get(session_id) == stream_id:
|
|
586
|
+
_APPROVAL_CB_OWNER.pop(session_id, None)
|
|
587
|
+
try:
|
|
588
|
+
unregister_gateway_notify(session_id)
|
|
589
|
+
except Exception: # noqa: BLE001
|
|
590
|
+
pass
|
|
591
|
+
cancelled = ctx.cancelled or run.cancel.is_set() or (bool(getattr(agent, "_interrupt_requested", False)) and error is None and not result.get("final_response"))
|
|
592
|
+
compressions_after = int(getattr(getattr(agent, "context_compressor", None), "compression_count", 0) or 0)
|
|
593
|
+
last_error = getattr(agent, "_last_error", None)
|
|
594
|
+
if not error and last_error:
|
|
595
|
+
error = str(last_error)
|
|
596
|
+
if not error and isinstance(result.get("error"), str) and result.get("error"):
|
|
597
|
+
error = str(result["error"])
|
|
598
|
+
status = "cancelled" if cancelled else ("error" if error and not result.get("messages") else "completed")
|
|
599
|
+
pending_steer = str(result.get("pending_steer") or "") if isinstance(result, dict) else ""
|
|
600
|
+
return {
|
|
601
|
+
"status": status,
|
|
602
|
+
"messages": [m for m in (result.get("messages") or []) if isinstance(m, dict)],
|
|
603
|
+
"final_response": str(result.get("final_response") or ""),
|
|
604
|
+
"error": error,
|
|
605
|
+
"result_status": str(result.get("status") or result.get("state") or ""),
|
|
606
|
+
"tool_limit_reached": bool(result.get("tool_limit_reached") or result.get("max_iterations_reached")),
|
|
607
|
+
"usage": _usage(agent),
|
|
608
|
+
"context": _context_length(agent),
|
|
609
|
+
"model": str(getattr(agent, "model", None) or resolved_model),
|
|
610
|
+
"provider": str(resolved_provider or ""),
|
|
611
|
+
"compressed": compressions_after > compressions_before,
|
|
612
|
+
"agent_session_id": str(getattr(agent, "session_id", None) or session_id),
|
|
613
|
+
"token_sent": token_sent[0],
|
|
614
|
+
"pending_steer": pending_steer,
|
|
615
|
+
"live_tool_calls": live_tool_calls,
|
|
616
|
+
}
|
|
617
|
+
finally:
|
|
618
|
+
with _RUNS_LOCK:
|
|
619
|
+
_RUNS.pop(stream_id, None)
|
|
620
|
+
if _RUNS_BY_SESSION.get(session_id) == stream_id:
|
|
621
|
+
_RUNS_BY_SESSION.pop(session_id, None)
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
def _run_for(params: dict) -> _Run | None:
|
|
625
|
+
stream_id = str(params.get("stream_id") or "").strip()
|
|
626
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
627
|
+
with _RUNS_LOCK:
|
|
628
|
+
if stream_id:
|
|
629
|
+
return _RUNS.get(stream_id)
|
|
630
|
+
if session_id:
|
|
631
|
+
sid = _RUNS_BY_SESSION.get(session_id)
|
|
632
|
+
return _RUNS.get(sid) if sid else None
|
|
633
|
+
return None
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
def register(registry) -> None:
|
|
637
|
+
@registry.method("chat.start")
|
|
638
|
+
def start_(ctx: CallContext, params: dict) -> dict:
|
|
639
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
640
|
+
workspace = params.get("workspace")
|
|
641
|
+
if not isinstance(workspace, str) or not workspace.strip():
|
|
642
|
+
raise InvalidParams("workspace is required")
|
|
643
|
+
with scoped_home(profile_home_param(params)):
|
|
644
|
+
with _turn_identity(session_id, workspace):
|
|
645
|
+
return start(ctx, params)
|
|
646
|
+
|
|
647
|
+
@registry.method("chat.interrupt", requires_agent=False)
|
|
648
|
+
def interrupt_(ctx: CallContext, params: dict) -> dict:
|
|
649
|
+
run = _run_for(params)
|
|
650
|
+
if run is None:
|
|
651
|
+
return {"ok": False, "reason": "not_running"}
|
|
652
|
+
run.cancel.set()
|
|
653
|
+
# Predecessor ``_finalize_webui_steers``: drain the Agent's not-yet-applied steer text so the server can
|
|
654
|
+
# settle queued steers (consumed vs leftover) before it writes the terminal cancel row.
|
|
655
|
+
pending = ""
|
|
656
|
+
agent = run.agent
|
|
657
|
+
if agent is not None:
|
|
658
|
+
drain = getattr(agent, "_drain_pending_steer", None)
|
|
659
|
+
try:
|
|
660
|
+
pending = str(drain() or "") if callable(drain) else _agent_pending_steer_text(agent)
|
|
661
|
+
except Exception: # noqa: BLE001
|
|
662
|
+
pending = _agent_pending_steer_text(agent)
|
|
663
|
+
return {"ok": True, "pending_steer": pending}
|
|
664
|
+
|
|
665
|
+
@registry.method("chat.steer", requires_agent=False)
|
|
666
|
+
def steer_(ctx: CallContext, params: dict) -> dict:
|
|
667
|
+
text = str(params.get("text") or "").strip()
|
|
668
|
+
if not text:
|
|
669
|
+
raise InvalidParams("text is required")
|
|
670
|
+
run = _run_for(params)
|
|
671
|
+
if run is None or run.agent is None:
|
|
672
|
+
return {"accepted": False, "fallback": "not_running"}
|
|
673
|
+
if not hasattr(run.agent, "steer"):
|
|
674
|
+
return {"accepted": False, "fallback": "agent_lacks_steer"}
|
|
675
|
+
try:
|
|
676
|
+
accepted = bool(run.agent.steer(text))
|
|
677
|
+
except Exception as exc: # noqa: BLE001
|
|
678
|
+
log.debug("steer failed: %s", exc)
|
|
679
|
+
return {"accepted": False, "fallback": "steer_error"}
|
|
680
|
+
return {"accepted": accepted, "fallback": None if accepted else "not_running"}
|
|
681
|
+
|
|
682
|
+
@registry.method("chat.evict_agent", requires_agent=False)
|
|
683
|
+
def evict_(ctx: CallContext, params: dict) -> dict:
|
|
684
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
685
|
+
with _AGENT_CACHE_LOCK:
|
|
686
|
+
evicted = _AGENT_CACHE.pop(session_id, None) is not None
|
|
687
|
+
try:
|
|
688
|
+
from tools.approval import clear_session
|
|
689
|
+
clear_session(session_id)
|
|
690
|
+
except Exception: # noqa: BLE001
|
|
691
|
+
pass
|
|
692
|
+
return {"evicted": evicted}
|
|
693
|
+
|
|
694
|
+
@registry.method("chat.commit_memory", requires_agent=False)
|
|
695
|
+
def commit_memory_(ctx: CallContext, params: dict) -> dict:
|
|
696
|
+
"""Predecessor ``commit_session_memory``: flush the cached Agent's memory for a session the user just left."""
|
|
697
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
698
|
+
with _AGENT_CACHE_LOCK:
|
|
699
|
+
cached = _AGENT_CACHE.get(session_id)
|
|
700
|
+
with _RUNS_LOCK:
|
|
701
|
+
busy = (_RUNS_BY_SESSION.get(session_id) or "") in _RUNS
|
|
702
|
+
agent = cached[0] if cached else None
|
|
703
|
+
commit = getattr(agent, "commit_memory_session", None) if agent is not None else None
|
|
704
|
+
if commit is None or busy:
|
|
705
|
+
return {"committed": False}
|
|
706
|
+
try:
|
|
707
|
+
commit()
|
|
708
|
+
except Exception as exc: # noqa: BLE001
|
|
709
|
+
log.warning("commit_memory_session() failed for session %s: %s", session_id, exc)
|
|
710
|
+
return {"committed": False}
|
|
711
|
+
return {"committed": True}
|
|
712
|
+
|
|
713
|
+
@registry.method("approval.respond", requires_agent=True)
|
|
714
|
+
def approval_respond_(ctx: CallContext, params: dict) -> dict:
|
|
715
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
716
|
+
choice = str(params.get("choice") or "deny").strip()
|
|
717
|
+
request_id = str(params.get("request_id") or "").strip() or None
|
|
718
|
+
if choice not in ("once", "session", "always", "deny"):
|
|
719
|
+
raise InvalidParams(f"Invalid choice: {choice}")
|
|
720
|
+
try:
|
|
721
|
+
from tools import approval as approval_mod
|
|
722
|
+
except Exception as exc: # noqa: BLE001
|
|
723
|
+
raise RpcError(f"approval module unavailable: {exc}", condition="agent_unavailable") from exc
|
|
724
|
+
with scoped_home(profile_home_param(params)):
|
|
725
|
+
entries = approval_mod.list_gateway_approvals(session_id)
|
|
726
|
+
targets = [e for e in entries if not request_id or e.get("request_id") == request_id]
|
|
727
|
+
keys = []
|
|
728
|
+
for entry in targets:
|
|
729
|
+
keys.extend(entry.get("pattern_keys") or [entry.get("pattern_key", "")])
|
|
730
|
+
keys = [k for k in keys if k]
|
|
731
|
+
if choice == "session":
|
|
732
|
+
for k in keys:
|
|
733
|
+
approval_mod.approve_session(session_id, k)
|
|
734
|
+
elif choice == "always":
|
|
735
|
+
for k in keys:
|
|
736
|
+
approval_mod.approve_session(session_id, k)
|
|
737
|
+
approval_mod.approve_permanent(k)
|
|
738
|
+
try:
|
|
739
|
+
# Persist the set that governs THIS home (per-profile under the home override), not the launch
|
|
740
|
+
# profile's module-level set, which would overwrite a named profile's allowlist with the wrong keys.
|
|
741
|
+
permanent_set = getattr(approval_mod, "_permanent_set", None)
|
|
742
|
+
with approval_mod._lock:
|
|
743
|
+
snapshot = set(permanent_set()) if callable(permanent_set) else set(approval_mod._permanent_approved)
|
|
744
|
+
approval_mod.save_permanent_allowlist(snapshot)
|
|
745
|
+
except Exception: # noqa: BLE001
|
|
746
|
+
log.debug("save_permanent_allowlist failed", exc_info=True)
|
|
747
|
+
resolved = approval_mod.resolve_gateway_approval(session_id, choice, request_id=request_id)
|
|
748
|
+
return {"ok": bool(resolved), "resolved": int(resolved or 0), "choice": choice}
|
|
749
|
+
|
|
750
|
+
@registry.method("approval.pending", requires_agent=True)
|
|
751
|
+
def approval_pending_(ctx: CallContext, params: dict) -> dict:
|
|
752
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
753
|
+
try:
|
|
754
|
+
from tools.approval import list_gateway_approvals
|
|
755
|
+
except Exception as exc: # noqa: BLE001
|
|
756
|
+
raise RpcError(f"approval module unavailable: {exc}", condition="agent_unavailable") from exc
|
|
757
|
+
return {"pending": list_gateway_approvals(session_id)}
|
|
758
|
+
|
|
759
|
+
@registry.method("approval.set_yolo", requires_agent=True)
|
|
760
|
+
def set_yolo_(ctx: CallContext, params: dict) -> dict:
|
|
761
|
+
session_id = str(params.get("session_id") or "").strip()
|
|
762
|
+
enabled = bool(params.get("enabled"))
|
|
763
|
+
try:
|
|
764
|
+
from tools.approval import disable_session_yolo, enable_session_yolo, is_session_yolo_enabled, resolve_gateway_approval
|
|
765
|
+
except Exception as exc: # noqa: BLE001
|
|
766
|
+
raise RpcError(f"approval module unavailable: {exc}", condition="agent_unavailable") from exc
|
|
767
|
+
(enable_session_yolo if enabled else disable_session_yolo)(session_id)
|
|
768
|
+
released = resolve_gateway_approval(session_id, "session", resolve_all=True) if enabled else 0
|
|
769
|
+
return {"yolo_enabled": bool(is_session_yolo_enabled(session_id)), "released": int(released or 0)}
|
|
770
|
+
|
|
771
|
+
@registry.method("clarify.respond", requires_agent=False)
|
|
772
|
+
def clarify_respond_(ctx: CallContext, params: dict) -> dict:
|
|
773
|
+
response = str(params.get("response") or "").strip()
|
|
774
|
+
clarify_id = str(params.get("clarify_id") or "").strip()
|
|
775
|
+
if not response:
|
|
776
|
+
raise InvalidParams("response is required")
|
|
777
|
+
run = _run_for(params)
|
|
778
|
+
if run is None:
|
|
779
|
+
return {"ok": False}
|
|
780
|
+
with run.lock:
|
|
781
|
+
entries = list(run.clarify_entries.values())
|
|
782
|
+
target = None
|
|
783
|
+
if clarify_id:
|
|
784
|
+
target = next((e for e in entries if e.clarify_id == clarify_id), None)
|
|
785
|
+
elif entries:
|
|
786
|
+
target = entries[0]
|
|
787
|
+
if target is None:
|
|
788
|
+
return {"ok": False}
|
|
789
|
+
target.result = response
|
|
790
|
+
target.event.set()
|
|
791
|
+
return {"ok": True, "clarify_id": target.clarify_id}
|