@maudecode/talaria-web 1.19.0 → 1.21.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/automation-raw.js +61 -6
- package/dist/api/automation-raw.js.map +1 -1
- package/dist/api/automation-router.d.ts +309 -2
- package/dist/api/automation-router.js +28 -2
- package/dist/api/automation-router.js.map +1 -1
- package/dist/api/chat-router.d.ts +646 -24
- package/dist/api/chat-router.js +54 -167
- package/dist/api/chat-router.js.map +1 -1
- package/dist/api/git-router.d.ts +54 -0
- package/dist/api/git-router.js +18 -5
- package/dist/api/git-router.js.map +1 -1
- package/dist/api/raw-routes.js +13 -1
- package/dist/api/raw-routes.js.map +1 -1
- package/dist/api/router.d.ts +3 -3
- package/dist/api/session-visibility.js +2 -2
- package/dist/api/session-visibility.js.map +1 -1
- package/dist/api/sessions-router.d.ts +1868 -79
- package/dist/api/sessions-router.js +72 -43
- package/dist/api/sessions-router.js.map +1 -1
- package/dist/api/settings-router.d.ts +34 -13
- package/dist/api/settings-router.js +54 -17
- package/dist/api/settings-router.js.map +1 -1
- package/dist/api/sse-routes.js +45 -21
- package/dist/api/sse-routes.js.map +1 -1
- package/dist/api/tools-router.d.ts +773 -39
- package/dist/api/tools-router.js +167 -45
- package/dist/api/tools-router.js.map +1 -1
- package/dist/app.js +15 -11
- package/dist/app.js.map +1 -1
- package/dist/auth/crypto.d.ts +3 -0
- package/dist/auth/crypto.js +18 -0
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/gate.js +5 -1
- package/dist/auth/gate.js.map +1 -1
- package/dist/cli/ctl.js +6 -1
- package/dist/cli/ctl.js.map +1 -1
- package/dist/cli/main.js +23 -18
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/supervise.d.ts +22 -0
- package/dist/cli/supervise.js +80 -2
- package/dist/cli/supervise.js.map +1 -1
- package/dist/config/agent-config.d.ts +3 -0
- package/dist/config/agent-config.js +36 -9
- package/dist/config/agent-config.js.map +1 -1
- package/dist/fs/atomic.d.ts +3 -0
- package/dist/fs/atomic.js +19 -5
- package/dist/fs/atomic.js.map +1 -1
- package/dist/fs/stat.d.ts +6 -0
- package/dist/fs/stat.js +18 -2
- package/dist/fs/stat.js.map +1 -1
- package/dist/http/context.d.ts +16 -0
- package/dist/http/context.js +48 -5
- package/dist/http/context.js.map +1 -1
- package/dist/profiles/profiles.d.ts +2 -0
- package/dist/profiles/profiles.js +1 -0
- package/dist/profiles/profiles.js.map +1 -1
- package/dist/providers/catalog.d.ts +11 -6
- package/dist/providers/catalog.js +76 -24
- package/dist/providers/catalog.js.map +1 -1
- package/dist/redact.d.ts +2 -0
- package/dist/redact.js +55 -16
- package/dist/redact.js.map +1 -1
- package/dist/release.js +5 -3
- package/dist/release.js.map +1 -1
- package/dist/runtime.js +118 -26
- package/dist/runtime.js.map +1 -1
- package/dist/server.js +25 -21
- package/dist/server.js.map +1 -1
- package/dist/sessions/admission.d.ts +21 -0
- package/dist/sessions/admission.js +176 -0
- package/dist/sessions/admission.js.map +1 -0
- package/dist/sessions/anchor.d.ts +4 -1
- package/dist/sessions/anchor.js +9 -5
- package/dist/sessions/anchor.js.map +1 -1
- package/dist/sessions/background-tasks.d.ts +41 -3
- package/dist/sessions/background-tasks.js +110 -10
- package/dist/sessions/background-tasks.js.map +1 -1
- package/dist/sessions/cli-sessions.d.ts +9 -2
- package/dist/sessions/cli-sessions.js +38 -57
- package/dist/sessions/cli-sessions.js.map +1 -1
- package/dist/sessions/completions.d.ts +8 -0
- package/dist/sessions/completions.js +55 -25
- package/dist/sessions/completions.js.map +1 -1
- package/dist/sessions/events.d.ts +3 -0
- package/dist/sessions/events.js +4 -0
- package/dist/sessions/events.js.map +1 -1
- package/dist/sessions/export.d.ts +2 -0
- package/dist/sessions/export.js +6 -2
- package/dist/sessions/export.js.map +1 -1
- package/dist/sessions/gateway-sessions.d.ts +92 -4
- package/dist/sessions/gateway-sessions.js +762 -93
- package/dist/sessions/gateway-sessions.js.map +1 -1
- package/dist/sessions/gateway-watcher.d.ts +10 -11
- package/dist/sessions/gateway-watcher.js +25 -21
- package/dist/sessions/gateway-watcher.js.map +1 -1
- package/dist/sessions/list.d.ts +9 -2
- package/dist/sessions/list.js +38 -26
- package/dist/sessions/list.js.map +1 -1
- package/dist/sessions/merge.d.ts +12 -5
- package/dist/sessions/merge.js +65 -18
- package/dist/sessions/merge.js.map +1 -1
- package/dist/sessions/prefix-index.d.ts +15 -4
- package/dist/sessions/prefix-index.js +35 -13
- package/dist/sessions/prefix-index.js.map +1 -1
- package/dist/sessions/prompt-queues.d.ts +36 -0
- package/dist/sessions/prompt-queues.js +318 -0
- package/dist/sessions/prompt-queues.js.map +1 -0
- package/dist/sessions/recovery.d.ts +1 -1
- package/dist/sessions/recovery.js +4 -3
- package/dist/sessions/recovery.js.map +1 -1
- package/dist/sessions/relay.d.ts +12 -1
- package/dist/sessions/relay.js +75 -17
- package/dist/sessions/relay.js.map +1 -1
- package/dist/sessions/service.d.ts +132 -37
- package/dist/sessions/service.js +688 -160
- package/dist/sessions/service.js.map +1 -1
- package/dist/sessions/session.d.ts +2 -0
- package/dist/sessions/session.js +5 -0
- package/dist/sessions/session.js.map +1 -1
- package/dist/sessions/state-db-worker.js +22 -5
- package/dist/sessions/state-db-worker.js.map +1 -1
- package/dist/sessions/state-db.d.ts +106 -15
- package/dist/sessions/state-db.js +651 -236
- package/dist/sessions/state-db.js.map +1 -1
- package/dist/sessions/state-saved.d.ts +1 -1
- package/dist/sessions/state-saved.js +35 -11
- package/dist/sessions/state-saved.js.map +1 -1
- package/dist/sessions/storage/backend.d.ts +10 -1
- package/dist/sessions/storage/backend.js.map +1 -1
- package/dist/sessions/storage/conformance.js +1 -1
- package/dist/sessions/storage/conformance.js.map +1 -1
- package/dist/sessions/storage/json-documents.d.ts +2 -0
- package/dist/sessions/storage/json-documents.js +71 -26
- package/dist/sessions/storage/json-documents.js.map +1 -1
- package/dist/sessions/storage/json-files.d.ts +13 -2
- package/dist/sessions/storage/json-files.js +126 -6
- package/dist/sessions/storage/json-files.js.map +1 -1
- package/dist/sessions/storage/json-journal.d.ts +6 -7
- package/dist/sessions/storage/json-journal.js +143 -73
- package/dist/sessions/storage/json-journal.js.map +1 -1
- package/dist/sessions/storage/json.d.ts +15 -1
- package/dist/sessions/storage/json.js +125 -33
- package/dist/sessions/storage/json.js.map +1 -1
- package/dist/sessions/store.d.ts +6 -1
- package/dist/sessions/store.js +68 -27
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/streams.d.ts +10 -7
- package/dist/sessions/streams.js +49 -14
- package/dist/sessions/streams.js.map +1 -1
- package/dist/sessions/tool-display.d.ts +11 -2
- package/dist/sessions/tool-display.js +45 -4
- package/dist/sessions/tool-display.js.map +1 -1
- package/dist/sessions/turn-context.js +6 -2
- package/dist/sessions/turn-context.js.map +1 -1
- package/dist/sessions/turn.d.ts +27 -6
- package/dist/sessions/turn.js +186 -89
- package/dist/sessions/turn.js.map +1 -1
- package/dist/sidecar/client.d.ts +24 -1
- package/dist/sidecar/client.js +118 -38
- package/dist/sidecar/client.js.map +1 -1
- package/dist/sidecar/fake.d.ts +6 -2
- package/dist/sidecar/fake.js +15 -2
- package/dist/sidecar/fake.js.map +1 -1
- package/dist/spa.d.ts +9 -4
- package/dist/spa.js +36 -12
- package/dist/spa.js.map +1 -1
- package/dist/startup-timing.d.ts +66 -0
- package/dist/startup-timing.js +129 -0
- package/dist/startup-timing.js.map +1 -0
- package/dist/test/fs-handles.d.ts +11 -0
- package/dist/test/fs-handles.js +31 -0
- package/dist/test/fs-handles.js.map +1 -0
- package/dist/tools/connectors.d.ts +1 -1
- package/dist/tools/connectors.js +2 -2
- package/dist/tools/connectors.js.map +1 -1
- package/dist/tools/crons.d.ts +8 -4
- package/dist/tools/crons.js +25 -18
- package/dist/tools/crons.js.map +1 -1
- package/dist/tools/dashboard-plugins.d.ts +29 -0
- package/dist/tools/dashboard-plugins.js +132 -0
- package/dist/tools/dashboard-plugins.js.map +1 -1
- package/dist/tools/gateway-restart.d.ts +25 -5
- package/dist/tools/gateway-restart.js +103 -23
- package/dist/tools/gateway-restart.js.map +1 -1
- package/dist/tools/health.d.ts +13 -1
- package/dist/tools/health.js +80 -22
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/insights.d.ts +1 -1
- package/dist/tools/insights.js +2 -2
- package/dist/tools/insights.js.map +1 -1
- package/dist/tools/kanban.d.ts +10 -1
- package/dist/tools/kanban.js +73 -1
- package/dist/tools/kanban.js.map +1 -1
- package/dist/tools/mcp-health.js +74 -24
- package/dist/tools/mcp-health.js.map +1 -1
- package/dist/tools/mcp.d.ts +3 -1
- package/dist/tools/mcp.js +92 -1
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/memory.d.ts +28 -0
- package/dist/tools/memory.js +120 -14
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/plugin-oauth.d.ts +14 -0
- package/dist/tools/plugin-oauth.js +53 -0
- package/dist/tools/plugin-oauth.js.map +1 -0
- package/dist/tools/prune-advice.d.ts +50 -0
- package/dist/tools/prune-advice.js +114 -0
- package/dist/tools/prune-advice.js.map +1 -0
- package/dist/tools/skills.d.ts +5 -2
- package/dist/tools/skills.js +9 -6
- package/dist/tools/skills.js.map +1 -1
- package/dist/tools/update-notifications.d.ts +77 -9
- package/dist/tools/update-notifications.js +390 -46
- package/dist/tools/update-notifications.js.map +1 -1
- package/dist/tools/updates.d.ts +29 -3
- package/dist/tools/updates.js +166 -34
- package/dist/tools/updates.js.map +1 -1
- package/dist/workspace/managed-buffers.d.ts +58 -0
- package/dist/workspace/managed-buffers.js +76 -0
- package/dist/workspace/managed-buffers.js.map +1 -0
- package/dist/workspace/media.js +69 -20
- package/dist/workspace/media.js.map +1 -1
- package/dist/workspace/preview.js +4 -14
- package/dist/workspace/preview.js.map +1 -1
- package/dist/workspace/rollback.d.ts +6 -2
- package/dist/workspace/rollback.js +18 -8
- package/dist/workspace/rollback.js.map +1 -1
- package/package.json +3 -3
- package/sidecar/agent_dependency.json +4 -4
- package/sidecar/agent_support.json +30 -15
- package/sidecar/scripts/suite_runner.py +183 -27
- package/sidecar/scripts/test.sh +5 -7
- package/sidecar/talaria_sidecar/__init__.py +1 -1
- package/sidecar/talaria_sidecar/__main__.py +10 -3
- package/sidecar/talaria_sidecar/agent_mutation.py +246 -32
- package/sidecar/talaria_sidecar/agent_services.py +157 -34
- package/sidecar/talaria_sidecar/context_detail.py +59 -0
- package/sidecar/talaria_sidecar/home.py +97 -20
- package/sidecar/talaria_sidecar/methods/__init__.py +2 -2
- package/sidecar/talaria_sidecar/methods/aux.py +80 -18
- package/sidecar/talaria_sidecar/methods/chat.py +571 -106
- package/sidecar/talaria_sidecar/methods/checkpoints.py +29 -4
- package/sidecar/talaria_sidecar/methods/commands.py +277 -16
- package/sidecar/talaria_sidecar/methods/config.py +73 -3
- package/sidecar/talaria_sidecar/methods/connectors.py +45 -13
- package/sidecar/talaria_sidecar/methods/cron.py +8 -2
- package/sidecar/talaria_sidecar/methods/dashboard_plugins.py +301 -0
- package/sidecar/talaria_sidecar/methods/gateway.py +24 -4
- package/sidecar/talaria_sidecar/methods/gateway_sessions.py +304 -30
- package/sidecar/talaria_sidecar/methods/kanban.py +50 -3
- package/sidecar/talaria_sidecar/methods/managed_buffers.py +110 -0
- package/sidecar/talaria_sidecar/methods/mcp.py +55 -0
- package/sidecar/talaria_sidecar/methods/oauth.py +139 -11
- package/sidecar/talaria_sidecar/methods/outbound_drafts.py +165 -0
- package/sidecar/talaria_sidecar/methods/plugin_catalog.py +198 -0
- package/sidecar/talaria_sidecar/methods/plugin_oauth.py +234 -0
- package/sidecar/talaria_sidecar/methods/process.py +70 -6
- package/sidecar/talaria_sidecar/methods/profiles.py +4 -3
- package/sidecar/talaria_sidecar/methods/runtime.py +2 -0
- package/sidecar/talaria_sidecar/methods/skills.py +22 -7
- package/sidecar/talaria_sidecar/methods/state_db.py +128 -42
- package/sidecar/talaria_sidecar/methods/toolsets.py +4 -2
- package/sidecar/talaria_sidecar/methods/worktree.py +121 -2
- package/sidecar/talaria_sidecar/rpc.py +25 -3
- package/sidecar/talaria_sidecar/runtime.py +42 -3
- package/sidecar/talaria_sidecar/speed.py +13 -1
- package/sidecar/talaria_sidecar/startup_timing.py +119 -0
- package/static/dist/FILES.txt +240 -213
- package/static/dist/THIRD_PARTY_LICENSES.md +6 -22
- package/static/dist/assets/AppShell-c5989995.js +8 -0
- package/static/dist/assets/Button-nuaikybd.js +1 -0
- package/static/dist/assets/ChatPage-bfg4khph.js +6 -0
- package/static/dist/assets/ConnectTargets-k5wo9yo8.js +1 -0
- package/static/dist/assets/Dialog-o8vo2aws.js +1 -0
- package/static/dist/assets/ExtensionRoute-l1yjrso4.js +1 -0
- package/static/dist/assets/Field-j7o8cfps.js +1 -0
- package/static/dist/assets/HubRoute-efnwe4xz.js +2 -0
- package/static/dist/assets/LinkCheckContext-ix6zqqkk.js +1 -0
- package/static/dist/assets/Markdown-clqf5m22.js +2 -0
- package/static/dist/assets/MarkdownRenderer-ccgqrza3.js +302 -0
- package/static/dist/assets/MarkdownRenderer-i9o6nr38.css +1 -0
- package/static/dist/assets/OAuthSignIn-h7bjaqp6.js +1 -0
- package/static/dist/assets/ResourceSwitch-oai2zqaj.js +1 -0
- package/static/dist/assets/RightPanel-ho161a45.js +1 -0
- package/static/dist/assets/Select-d1g5a8bm.js +1 -0
- package/static/dist/assets/SessionListPanel-i7kaokhi.js +1 -0
- package/static/dist/assets/SettingsLayout-lnecm87w.js +1 -0
- package/static/dist/assets/States-easntmry.js +1 -0
- package/static/dist/assets/TerminalPanel-lxhwd4jl.js +16 -0
- package/static/dist/assets/Toaster-l4sciy8t.js +1 -0
- package/static/dist/assets/_app-mqexqbg8.js +1 -0
- package/static/dist/assets/_app.ext._extensionId-n797jp72.js +1 -0
- package/static/dist/assets/_app.index-ne43mdw2.js +1 -0
- package/static/dist/assets/_app.insights-fqonovb4.js +1 -0
- package/static/dist/assets/_app.kanban-kysliv19.js +1 -0
- package/static/dist/assets/_app.logs-febut82r.js +1 -0
- package/static/dist/assets/_app.memory-ha86oj1c.js +1 -0
- package/static/dist/assets/_app.profiles-cnu3gxxq.js +1 -0
- package/static/dist/assets/_app.session._sessionId-ifzjpcgn.js +1 -0
- package/static/dist/assets/_app.settings-nmakdiaf.js +1 -0
- package/static/dist/assets/_app.settings._section-djglnjmi.js +3 -0
- package/static/dist/assets/_app.skills-f3wad8yo.js +1 -0
- package/static/dist/assets/_app.tasks-l10py1c0.js +1 -0
- package/static/dist/assets/_app.todos-bml1m3r1.js +1 -0
- package/static/dist/assets/_app.workspaces-f3d066lx.js +1 -0
- package/static/dist/assets/abnfDiagram-VCTEODGH-i53jc4yp.js +1 -0
- package/static/dist/assets/{angular-html-nu6l31w3.js → angular-html-l28bd5fo.js} +1 -1
- package/static/dist/assets/{angular-ts-fbx4f8mm.js → angular-ts-ffzx1vj0.js} +1 -1
- package/static/dist/assets/{apl-bx2xr7dh.js → apl-b7h7mmy4.js} +1 -1
- package/static/dist/assets/{arc-7popfhbk.js → arc-fk1b21lm.js} +1 -1
- package/static/dist/assets/architecture-7GRP2DOG-e3bv5m6f.js +1 -0
- package/static/dist/assets/architectureDiagram-5GKGNRK7-pakekxu2.js +36 -0
- package/static/dist/assets/archive-ihqi7z2x.js +1 -0
- package/static/dist/assets/{astro-g77i97cb.js → astro-k117fy0t.js} +1 -1
- package/static/dist/assets/back-gu3nu279.js +1 -0
- package/static/dist/assets/{blade-boo0u92y.js → blade-npefsmn8.js} +1 -1
- package/static/dist/assets/{blockDiagram-I7D4REHJ-joedghi3.js → blockDiagram-I7D4REHJ-bc6bo1n6.js} +4 -4
- package/static/dist/assets/{c-cat0w3sc.js → c-2umg6kbn.js} +1 -1
- package/static/dist/assets/{c4Diagram-7LVT6UL2-hyrjrohe.js → c4Diagram-7LVT6UL2-btvwk2qx.js} +1 -1
- package/static/dist/assets/channel-jn4f8443.js +1 -0
- package/static/dist/assets/{chunk-4HAMMTFA-koouqbut.js → chunk-4HAMMTFA-dlwab11c.js} +20 -20
- package/static/dist/assets/{chunk-75Z2AOVW-bl4bhdnt.js → chunk-75Z2AOVW-dp5gh7i8.js} +1 -1
- package/static/dist/assets/chunk-DU6HZSFF-bi06zl1c.js +128 -0
- package/static/dist/assets/{chunk-F27PBJKO-d8xxi0zi.js → chunk-F27PBJKO-kvv1rnlh.js} +1 -1
- package/static/dist/assets/{chunk-FOHPRMQF-opuflp73.js → chunk-FOHPRMQF-ipewusgj.js} +8 -8
- package/static/dist/assets/{chunk-GMAD6QVW-jro0hl73.js → chunk-GMAD6QVW-ji0rx9by.js} +6 -6
- package/static/dist/assets/{chunk-GVQU2GXP-djn6gbyu.js → chunk-GVQU2GXP-nmz0j82p.js} +1 -1
- package/static/dist/assets/{chunk-IMKFNOWR-vw4p5p7o.js → chunk-IMKFNOWR-kmi1qx88.js} +5 -5
- package/static/dist/assets/{chunk-L3NEJ4N5-n1hj77q8.js → chunk-L3NEJ4N5-xhb7mebj.js} +1 -1
- package/static/dist/assets/chunk-OSK3NFVY-5a9sgscq.js +10 -0
- package/static/dist/assets/{chunk-P2QGCYS3-onf1hz6c.js → chunk-P2QGCYS3-dfezp4vu.js} +1 -1
- package/static/dist/assets/{chunk-POPQ4Y6H-m8sqn7cs.js → chunk-POPQ4Y6H-gd2vq3c0.js} +1 -1
- package/static/dist/assets/{chunk-PWAF6VOD-ek4smc8x.js → chunk-PWAF6VOD-wvw2nksf.js} +1 -1
- package/static/dist/assets/{chunk-SHT3W25Y-g9gfvefo.js → chunk-SHT3W25Y-f58q97px.js} +13 -13
- package/static/dist/assets/{chunk-SVP7TREG-f9nfv2cu.js → chunk-SVP7TREG-abgwpyz9.js} +4 -4
- package/static/dist/assets/{chunk-TICWLB2K-bnk3m1mq.js → chunk-TICWLB2K-h4sbs8ds.js} +6 -6
- package/static/dist/assets/{chunk-XXDRQBXY-n40pf9vy.js → chunk-XXDRQBXY-jkmnqu65.js} +1 -1
- package/static/dist/assets/classDiagram-ZZMXUADV-dzrw66se.js +1 -0
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-dzrw66se.js +1 -0
- package/static/dist/assets/{cobol-go622aep.js → cobol-ssf9hkh7.js} +1 -1
- package/static/dist/assets/{coffee-jwo1xjhq.js → coffee-lsi9fwae.js} +1 -1
- package/static/dist/assets/completionAudio-ce86msbu.js +1 -0
- package/static/dist/assets/copied-bz3gkazh.js +1 -0
- package/static/dist/assets/copy-m9h56qa8.js +1 -0
- package/static/dist/assets/cose-bilkent-JH36ORCC-layy2r27.js +1 -0
- package/static/dist/assets/{cpp-nre7j0kq.js → cpp-lfrh4y55.js} +1 -1
- package/static/dist/assets/{crystal-lviso2je.js → crystal-efh4pte7.js} +1 -1
- package/static/dist/assets/{css-ywz9j4hb.js → css-i82qdo89.js} +1 -1
- package/static/dist/assets/cynefin-OW5HDTMX-g081vffs.js +1 -0
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-odxvjesk.js +62 -0
- package/static/dist/assets/cytoscape.esm-fjn2algp.js +321 -0
- package/static/dist/assets/dagre-GXQ25YYZ-cpdwzjs4.js +4 -0
- package/static/dist/assets/dagre-o5jmjz46.js +1 -0
- package/static/dist/assets/{diagram-S7CK7UJ4-m6aeoe7c.js → diagram-S7CK7UJ4-clv5mxvu.js} +4 -4
- package/static/dist/assets/diagram-UQ7AKVKN-m2ia1mbf.js +41 -0
- package/static/dist/assets/{diagram-VSXAHHWV-hbawi7hn.js → diagram-VSXAHHWV-ea6zv636.js} +1 -1
- package/static/dist/assets/diagram-VX7I27RA-oqlef685.js +24 -0
- package/static/dist/assets/diagram-Z3DM3KII-kjubcbwu.js +24 -0
- package/static/dist/assets/dist-carq1azj.js +44 -0
- package/static/dist/assets/dist-crc46di9.js +7 -0
- package/static/dist/assets/{dist-c4c2m3kv.js → dist-nb670eu6.js} +1 -1
- package/static/dist/assets/ebnfDiagram-PWID7BFC-fg0zri3e.js +1 -0
- package/static/dist/assets/{edge-dvv35byi.js → edge-lrob635n.js} +1 -1
- package/static/dist/assets/{elixir-i2f1ki1g.js → elixir-kdpxeq93.js} +1 -1
- package/static/dist/assets/{elm-cpepyjm4.js → elm-c8irj9uh.js} +1 -1
- package/static/dist/assets/erDiagram-RLTQ6QDP-eb7pmk3x.js +99 -0
- package/static/dist/assets/{erb-idlyfheg.js → erb-flwsv146.js} +1 -1
- package/static/dist/assets/eventmodeling-NTZA5JFV-gvi1fxhn.js +1 -0
- package/static/dist/assets/flowDiagram-HODETNUW-abekab15.js +1 -0
- package/static/dist/assets/folder-plus-ksaons88.js +1 -0
- package/static/dist/assets/{ganttDiagram-EL5Y4UJY-ma6jxj5i.js → ganttDiagram-EL5Y4UJY-jmisowrc.js} +1 -1
- package/static/dist/assets/{git-rebase-d9lpfpbn.js → git-rebase-bli19aoq.js} +1 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-m7kt3u6e.js +1 -0
- package/static/dist/assets/{gitGraphDiagram-WWUBYQGX-hzltvsod.js → gitGraphDiagram-WWUBYQGX-nq7vfzh2.js} +1 -1
- package/static/dist/assets/{glimmer-js-39i0urfb.js → glimmer-js-d4icg38p.js} +1 -1
- package/static/dist/assets/{glimmer-ts-gdtd6n73.js → glimmer-ts-bk75772u.js} +1 -1
- package/static/dist/assets/{glsl-o1djm5pp.js → glsl-lqormp2b.js} +1 -1
- package/static/dist/assets/{graphql-kj6rz55t.js → graphql-hw6s5qzd.js} +1 -1
- package/static/dist/assets/{hack-pe1qqr2i.js → hack-ozrv6l4d.js} +1 -1
- package/static/dist/assets/{haml-cknnbcqs.js → haml-gytfosdt.js} +1 -1
- package/static/dist/assets/{handlebars-hwq64orh.js → handlebars-b6g7jffd.js} +1 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-gcu017ay.js +1 -0
- package/static/dist/assets/host-ipp4e84c.js +1 -0
- package/static/dist/assets/{html-derivative-h2i2pyjc.js → html-derivative-f1tqcroo.js} +1 -1
- package/static/dist/assets/{html-ha05xtvt.js → html-on6oj6yj.js} +1 -1
- package/static/dist/assets/{http-cf94zu27.js → http-odhufsl7.js} +1 -1
- package/static/dist/assets/{hurl-lslax568.js → hurl-mu680336.js} +1 -1
- package/static/dist/assets/index-d6vbxlra.js +13 -0
- package/static/dist/assets/index-ey6qo0zx.css +2 -0
- package/static/dist/assets/info-A6RAGUB7-idazwfqe.js +1 -0
- package/static/dist/assets/infoDiagram-27XIBGKW-bb9jh8gl.js +2 -0
- package/static/dist/assets/{ishikawaDiagram-5VMMS53U-e7bnwq7h.js → ishikawaDiagram-5VMMS53U-nqc132rv.js} +6 -6
- package/static/dist/assets/{java-ndjf2o89.js → java-nxbe8uju.js} +1 -1
- package/static/dist/assets/{javascript-coftlwy3.js → javascript-lz3kxcyz.js} +1 -1
- package/static/dist/assets/{jinja-etei9wy7.js → jinja-l5pk84gt.js} +1 -1
- package/static/dist/assets/{jison-hyekgft1.js → jison-jdutdwyy.js} +1 -1
- package/static/dist/assets/{journeyDiagram-3NMN7TZE-etd1bi6p.js → journeyDiagram-3NMN7TZE-fpvnhy44.js} +1 -1
- package/static/dist/assets/{json-lok0yaho.js → json-dnge4ssf.js} +1 -1
- package/static/dist/assets/{jsx-b64w0nbx.js → jsx-c3lwhkep.js} +1 -1
- package/static/dist/assets/{jsx-runtime-eu92a5pu.js → jsx-runtime-o40ukmjl.js} +1 -1
- package/static/dist/assets/{julia-jxxzz2yn.js → julia-hwd4rrcb.js} +1 -1
- package/static/dist/assets/{just-mc29iw9t.js → just-nka3oxdx.js} +1 -1
- package/static/dist/assets/{kanban-definition-UXKFOSKX-emb1g9dz.js → kanban-definition-UXKFOSKX-ndzqm6fu.js} +28 -28
- package/static/dist/assets/katex-cbdd1ohw.css +1 -0
- package/static/dist/assets/katex-pbij2oo6.js +257 -0
- package/static/dist/assets/{latex-pafa03ft.js → latex-iqmr7e40.js} +1 -1
- package/static/dist/assets/lazyRouteComponent-javud235.js +1 -0
- package/static/dist/assets/{line-h0ojzsvs.js → line-g625e7cj.js} +1 -1
- package/static/dist/assets/linear-jlwrvvy6.js +1 -0
- package/static/dist/assets/link-gfdaho08.js +2 -0
- package/static/dist/assets/{liquid-hz5c2pov.js → liquid-okmk9tbp.js} +1 -1
- package/static/dist/assets/locale-cs-n41hptse.js +5 -0
- package/static/dist/assets/locale-de-k7ht47ew.js +5 -0
- package/static/dist/assets/locale-es-ih078lco.js +5 -0
- package/static/dist/assets/locale-fr-ojabnf41.js +5 -0
- package/static/dist/assets/locale-it-kb96jufy.js +5 -0
- package/static/dist/assets/locale-ja-jpsp3xs1.js +7 -0
- package/static/dist/assets/locale-ko-cpzuy0n7.js +5 -0
- package/static/dist/assets/locale-pl-dbap4leu.js +5 -0
- package/static/dist/assets/locale-pt-nci7w72x.js +5 -0
- package/static/dist/assets/locale-ru-soghe4cs.js +7 -0
- package/static/dist/assets/locale-tr-ks00mu68.js +5 -0
- package/static/dist/assets/locale-vi-ij7twfm6.js +5 -0
- package/static/dist/assets/locale-zh-Hant-feakwr7a.js +5 -0
- package/static/dist/assets/locale-zh-ren0vjyv.js +7 -0
- package/static/dist/assets/login-iv6yq4xf.js +1 -0
- package/static/dist/assets/{lua-leyf8mlb.js → lua-krx4xj5h.js} +1 -1
- package/static/dist/assets/{marko-cn1fzpdv.js → marko-gbvpfehz.js} +1 -1
- package/static/dist/assets/{mdc-huhy88df.js → mdc-c21zlyi5.js} +1 -1
- package/static/dist/assets/mermaid-HWGCJPDP-cwj5cl6k.js +1 -0
- package/static/dist/assets/mermaid-parser.core-plzkuzov.js +7 -0
- package/static/dist/assets/micromark-factory-space-fnmnpi6s.js +1 -0
- package/static/dist/assets/{mindmap-definition-YA3MSWOX-o1vathns.js → mindmap-definition-YA3MSWOX-ojrgs569.js} +28 -28
- package/static/dist/assets/{nginx-e7lvhsmn.js → nginx-f3d68ed4.js} +1 -1
- package/static/dist/assets/{nim-dun5d8mk.js → nim-dw0jcy70.js} +1 -1
- package/static/dist/assets/onboarding-ff4emacu.js +1 -0
- package/static/dist/assets/packet-AYTQ26CC-gyaf9s8h.js +1 -0
- package/static/dist/assets/pegDiagram-XKGWAZYB-bf6xj8mq.js +1 -0
- package/static/dist/assets/{perl-bj3oqtet.js → perl-3c0r45c8.js} +1 -1
- package/static/dist/assets/{php-buzp12r0.js → php-rznhidvp.js} +1 -1
- package/static/dist/assets/pie-WAS4IAKB-f5ymzelo.js +1 -0
- package/static/dist/assets/pieDiagram-E7YTZNPT-d0qjl3zi.js +39 -0
- package/static/dist/assets/{pug-mjad7he9.js → pug-f2le4f3y.js} +1 -1
- package/static/dist/assets/{qml-d1gdp10s.js → qml-e2wbq9cr.js} +1 -1
- package/static/dist/assets/{quadrantDiagram-AXDQQJYC-owqc4uqn.js → quadrantDiagram-AXDQQJYC-oqy1mras.js} +1 -1
- package/static/dist/assets/queryKeys-x8fjxhut.js +9 -0
- package/static/dist/assets/{r-o3r9c7ao.js → r-epfzuw6q.js} +1 -1
- package/static/dist/assets/radar-RG4KPBEZ-b6jcjvda.js +1 -0
- package/static/dist/assets/railroad-74A4TZTK-e3a6lk5k.js +1 -0
- package/static/dist/assets/railroad-abnf-HS5TGJTU-ff5hocrx.js +1 -0
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-exkhyw4n.js +1 -0
- package/static/dist/assets/railroad-peg-WCYAUIDC-jefk9b7c.js +1 -0
- package/static/dist/assets/railroadDiagram-O6MQD6OU-e4amks1i.js +1 -0
- package/static/dist/assets/{razor-ilc585yr.js → razor-pea1u1d0.js} +1 -1
- package/static/dist/assets/refresh-cw-lfp4u1oh.js +1 -0
- package/static/dist/assets/{regexp-mpjtcvwm.js → regexp-hzte0a5x.js} +1 -1
- package/static/dist/assets/registry-g7w3353u.js +1 -0
- package/static/dist/assets/requirementDiagram-BXWQKSXE-c77k1e2y.js +84 -0
- package/static/dist/assets/rolldown-runtime-bnnw9q4a.js +1 -0
- package/static/dist/assets/{rst-jrkwjdyi.js → rst-m6tugj5o.js} +1 -1
- package/static/dist/assets/{ruby-n4tjcbpz.js → ruby-l19vq3w1.js} +1 -1
- package/static/dist/assets/runtime-nlxpnegr.js +1 -0
- package/static/dist/assets/{sankeyDiagram-P5KCCOFB-iqc02emv.js → sankeyDiagram-P5KCCOFB-oa1cc52s.js} +1 -1
- package/static/dist/assets/{sas-hjo6y93k.js → sas-ktdxo397.js} +1 -1
- package/static/dist/assets/{scss-ncidjv48.js → scss-kn3oxfwf.js} +1 -1
- package/static/dist/assets/{sequenceDiagram-WJ2MYXX4-i0v116q0.js → sequenceDiagram-WJ2MYXX4-j20gqt22.js} +11 -11
- package/static/dist/assets/settings_section_extensions_title-fadc7o65.js +1 -0
- package/static/dist/assets/share._token-kmfoflw6.js +2 -0
- package/static/dist/assets/{shellscript-m8whjpqd.js → shellscript-l100jtrg.js} +1 -1
- package/static/dist/assets/{shellsession-i5bj6syz.js → shellsession-m5qukwow.js} +1 -1
- package/static/dist/assets/sizeCapture-INFHLROL-dk1io13w.js +1 -0
- package/static/dist/assets/sliders-horizontal-g5jkzd9k.js +1 -0
- package/static/dist/assets/{soy-hhh36ysq.js → soy-mexlscur.js} +1 -1
- package/static/dist/assets/{sql-j21bzcl6.js → sql-o0ho5suh.js} +1 -1
- package/static/dist/assets/src-h89s0hs4.js +1 -0
- package/static/dist/assets/{stata-bbu2onh1.js → stata-be9ck1q3.js} +1 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-co2ghkdp.js +1 -0
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-faw1opgh.js +1 -0
- package/static/dist/assets/{surrealql-l5vczuco.js → surrealql-gk1xkkyy.js} +1 -1
- package/static/dist/assets/{svelte-idn422g6.js → svelte-k6ecjilf.js} +1 -1
- package/static/dist/assets/swimlanes-42K2YHIH-m30cktqe.js +1 -0
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-hfil433g.js +8 -0
- package/static/dist/assets/{templ-e22qou3c.js → templ-gf3bftk6.js} +1 -1
- package/static/dist/assets/{tex-deqpc5ee.js → tex-d21fqv1z.js} +1 -1
- package/static/dist/assets/{timeline-definition-24CTP7MA-ol2hnvma.js → timeline-definition-24CTP7MA-liuep6fl.js} +8 -8
- package/static/dist/assets/toast-zmb35u3r.js +56 -0
- package/static/dist/assets/treeView-Q6P3EWNA-np5d2jv2.js +1 -0
- package/static/dist/assets/treemap-WGGIJYW6-cmpltxh1.js +1 -0
- package/static/dist/assets/{ts-tags-ctnibc27.js → ts-tags-n0g61gr6.js} +1 -1
- package/static/dist/assets/{tsx-i163n32g.js → tsx-cvv7wv6q.js} +1 -1
- package/static/dist/assets/{twig-x0fi7wm8.js → twig-n1f67204.js} +1 -1
- package/static/dist/assets/{typescript-g18c34xz.js → typescript-og7o55cx.js} +1 -1
- package/static/dist/assets/untitled-mj86r4gz.js +1 -0
- package/static/dist/assets/useDebounced-g8r0ggve.js +1 -0
- package/static/dist/assets/useForm-f1udzsjf.js +1 -0
- package/static/dist/assets/{useParams-gjc70qru.js → useParams-ierevvts.js} +1 -1
- package/static/dist/assets/{useSearch-e6ae539u.js → useSearch-i7nr9ypl.js} +1 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-b2g42qrg.js +34 -0
- package/static/dist/assets/{vue-mwu5l1bb.js → vue-ej4xpwqw.js} +1 -1
- package/static/dist/assets/{vue-html-nskj3du0.js → vue-html-d48xsjuo.js} +1 -1
- package/static/dist/assets/{vue-vine-cqe77smq.js → vue-vine-pev88ip6.js} +1 -1
- package/static/dist/assets/wardley-WFR3VGLG-lb0eqbff.js +1 -0
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-ermwaqha.js +78 -0
- package/static/dist/assets/with-selector-nu1b5z0v.js +1 -0
- package/static/dist/assets/{xml-gau7gvrv.js → xml-ifxp6gqb.js} +1 -1
- package/static/dist/assets/{xsl-ew09zq8b.js → xsl-fug2cckc.js} +1 -1
- package/static/dist/assets/{xychartDiagram-S5SC5T6Z-aqbgvujg.js → xychartDiagram-S5SC5T6Z-dll0jldk.js} +6 -6
- package/static/dist/assets/{yaml-ofnrxtvf.js → yaml-fjmafnlo.js} +1 -1
- package/static/dist/extension-sdk.js +1 -1
- package/static/dist/index.html +1 -1
- package/static/dist/sw.js +180 -136
- package/static/dist/assets/AppShell-cey33v9s.js +0 -8
- package/static/dist/assets/ChatPage-i8wnugr7.js +0 -18
- package/static/dist/assets/ConnectTargets-hg19553x.js +0 -1
- package/static/dist/assets/ExtensionRoute-cly4apm5.js +0 -1
- package/static/dist/assets/Field-j8uqoigz.js +0 -9
- package/static/dist/assets/HubRoute-e4bgz41j.js +0 -2
- package/static/dist/assets/Markdown-lahuichm.js +0 -598
- package/static/dist/assets/Markdown-lwviulmg.css +0 -1
- package/static/dist/assets/RightPanel-lbo4i0fn.js +0 -1
- package/static/dist/assets/Select-gqatm2e0.js +0 -1
- package/static/dist/assets/SessionListPanel-mfqayfjh.js +0 -1
- package/static/dist/assets/SettingsLayout-b8980u7k.js +0 -1
- package/static/dist/assets/States-e7dkgtxf.js +0 -1
- package/static/dist/assets/Toaster-bfqqy786.js +0 -1
- package/static/dist/assets/_app-n1n6pfx1.js +0 -1
- package/static/dist/assets/_app.ext._extensionId-buxjxav3.js +0 -1
- package/static/dist/assets/_app.index-jt8zwiu2.js +0 -1
- package/static/dist/assets/_app.insights-cv76ml71.js +0 -1
- package/static/dist/assets/_app.kanban-h6ts53j7.js +0 -1
- package/static/dist/assets/_app.logs-dm873z90.js +0 -1
- package/static/dist/assets/_app.memory-glk5y6m8.js +0 -1
- package/static/dist/assets/_app.profiles-ka6zpstq.js +0 -1
- package/static/dist/assets/_app.session._sessionId-g2vzghvc.js +0 -1
- package/static/dist/assets/_app.settings-hgjdhzcd.js +0 -1
- package/static/dist/assets/_app.settings._section-jf2kmhae.js +0 -3
- package/static/dist/assets/_app.skills-cii852yq.js +0 -1
- package/static/dist/assets/_app.tasks-fp9q7atm.js +0 -1
- package/static/dist/assets/_app.todos-dw94qzue.js +0 -1
- package/static/dist/assets/_app.workspaces-inyygzze.js +0 -1
- package/static/dist/assets/abnfDiagram-VCTEODGH-gjayq3ra.js +0 -1
- package/static/dist/assets/architecture-7GRP2DOG-lp56972r.js +0 -1
- package/static/dist/assets/architectureDiagram-5GKGNRK7-nwb3xovn.js +0 -36
- package/static/dist/assets/archive-b1j004vn.js +0 -1
- package/static/dist/assets/back-g74gkozu.js +0 -1
- package/static/dist/assets/channel-es95o4y8.js +0 -1
- package/static/dist/assets/chunk-DU6HZSFF-gpedttsp.js +0 -128
- package/static/dist/assets/chunk-OSK3NFVY-oy0gwn2n.js +0 -10
- package/static/dist/assets/classDiagram-ZZMXUADV-kmihoqxh.js +0 -1
- package/static/dist/assets/classDiagram-v2-VYDZK3BY-kmihoqxh.js +0 -1
- package/static/dist/assets/copied-bli9tbcx.js +0 -1
- package/static/dist/assets/copy-jamtd1pf.js +0 -1
- package/static/dist/assets/cose-bilkent-JH36ORCC-eclcy6ja.js +0 -1
- package/static/dist/assets/cynefin-OW5HDTMX-f8xfdd3f.js +0 -1
- package/static/dist/assets/cynefinDiagram-5FMLGOSQ-n9lb99h9.js +0 -62
- package/static/dist/assets/cytoscape.esm-bqu53u12.js +0 -321
- package/static/dist/assets/dagre-GXQ25YYZ-dgailddi.js +0 -4
- package/static/dist/assets/dagre-lkoknbjn.js +0 -1
- package/static/dist/assets/diagram-UQ7AKVKN-jall3j0x.js +0 -41
- package/static/dist/assets/diagram-VX7I27RA-hendl2tt.js +0 -24
- package/static/dist/assets/diagram-Z3DM3KII-igwc35p3.js +0 -24
- package/static/dist/assets/ebnfDiagram-PWID7BFC-c64knz08.js +0 -1
- package/static/dist/assets/erDiagram-RLTQ6QDP-brdu9lcm.js +0 -99
- package/static/dist/assets/eventmodeling-NTZA5JFV-njk1j8wl.js +0 -1
- package/static/dist/assets/flowDiagram-HODETNUW-nma6f0ga.js +0 -1
- package/static/dist/assets/folder-plus-lvt9kudb.js +0 -1
- package/static/dist/assets/gitGraph-4MIJSDKK-naa9w6xa.js +0 -1
- package/static/dist/assets/highlighted-body-KPVGNVTW-ghoavj8d.js +0 -1
- package/static/dist/assets/host-hzm8n85n.js +0 -1
- package/static/dist/assets/index-drdcaqeq.css +0 -2
- package/static/dist/assets/index-jzm844he.js +0 -11
- package/static/dist/assets/info-A6RAGUB7-mn2ut5ko.js +0 -1
- package/static/dist/assets/infoDiagram-27XIBGKW-h6kuqvsb.js +0 -2
- package/static/dist/assets/lazyRouteComponent-o816ytzl.js +0 -1
- package/static/dist/assets/linear-becwlnhk.js +0 -1
- package/static/dist/assets/link-k01ryaf9.js +0 -1
- package/static/dist/assets/login-bsae49ew.js +0 -1
- package/static/dist/assets/mermaid-HWGCJPDP-ihl34s74.js +0 -1
- package/static/dist/assets/mermaid-parser.core-bnre27u8.js +0 -7
- package/static/dist/assets/not-found-ccnnac39.js +0 -1
- package/static/dist/assets/onboarding-c65tysya.js +0 -1
- package/static/dist/assets/onboarding_model_label-gpn28uix.js +0 -1
- package/static/dist/assets/packet-AYTQ26CC-hatq7m2e.js +0 -1
- package/static/dist/assets/pegDiagram-XKGWAZYB-gwisz8jv.js +0 -1
- package/static/dist/assets/pie-WAS4IAKB-fpftf0mk.js +0 -1
- package/static/dist/assets/pieDiagram-E7YTZNPT-khm1o9a6.js +0 -39
- package/static/dist/assets/radar-RG4KPBEZ-cntfwjpq.js +0 -1
- package/static/dist/assets/railroad-74A4TZTK-a7t5eibp.js +0 -1
- package/static/dist/assets/railroad-abnf-HS5TGJTU-ol8cdktf.js +0 -1
- package/static/dist/assets/railroad-ebnf-LZEXJU2U-i8vzd429.js +0 -1
- package/static/dist/assets/railroad-peg-WCYAUIDC-nw3ulewz.js +0 -1
- package/static/dist/assets/railroadDiagram-O6MQD6OU-etuh0qa0.js +0 -1
- package/static/dist/assets/refresh-cw-mqbkv2a3.js +0 -1
- package/static/dist/assets/refresh-l29ljp76.js +0 -1
- package/static/dist/assets/requirementDiagram-BXWQKSXE-oq2ulk22.js +0 -84
- package/static/dist/assets/rolldown-runtime-b9miacsj.js +0 -1
- package/static/dist/assets/root-mbklpuv4.js +0 -1
- package/static/dist/assets/saved-ndd4t2xb.js +0 -1
- package/static/dist/assets/settings_section_extensions_title-jhfo6o8z.js +0 -1
- package/static/dist/assets/share._token-c1ri0hy1.js +0 -2
- package/static/dist/assets/sizeCapture-INFHLROL-g612l48j.js +0 -1
- package/static/dist/assets/sliders-horizontal-j3jjt9tv.js +0 -1
- package/static/dist/assets/src-hjyib4mu.js +0 -1
- package/static/dist/assets/stateDiagram-D77RDMKH-dnpt1ato.js +0 -1
- package/static/dist/assets/stateDiagram-v2-MP3YSRHH-bxjacpk6.js +0 -1
- package/static/dist/assets/swimlanes-42K2YHIH-loqbdazb.js +0 -1
- package/static/dist/assets/swimlanesDiagram-VR7AAH4N-id62p9hz.js +0 -8
- package/static/dist/assets/toast-i3h34v6o.js +0 -64
- package/static/dist/assets/treeView-Q6P3EWNA-idrj6iox.js +0 -1
- package/static/dist/assets/treemap-WGGIJYW6-lzr49vv5.js +0 -1
- package/static/dist/assets/untitled-oaoya4qj.js +0 -1
- package/static/dist/assets/useForm-nfaxgmsk.js +0 -1
- package/static/dist/assets/vennDiagram-4TSXK5OY-bvwr9o2z.js +0 -34
- package/static/dist/assets/wardley-WFR3VGLG-31ui8tma.js +0 -1
- package/static/dist/assets/wardleyDiagram-VM6X3IG4-k5wqtx4b.js +0 -78
- /package/static/dist/assets/{ChatPage-gmu5c7lf.css → TerminalPanel-gmu5c7lf.css} +0 -0
|
@@ -38,11 +38,12 @@ def available() -> bool:
|
|
|
38
38
|
return bool(connectors_available())
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def _open() -> None:
|
|
42
|
-
"""
|
|
43
|
-
for a user who has none (the page asking for apps is the user asking, as on the Agent's desktop)."""
|
|
41
|
+
def _open(*, creates_guest: bool = False) -> None:
|
|
42
|
+
"""Only explicit Connect may provision; every other page action is noncreating."""
|
|
44
43
|
if not available():
|
|
45
44
|
raise RpcError("Connectors are not available.", condition="connectors_unavailable")
|
|
45
|
+
if not creates_guest:
|
|
46
|
+
return
|
|
46
47
|
try:
|
|
47
48
|
from tools.connectors import ensure_guest_identity
|
|
48
49
|
except Exception: # noqa: BLE001 - an Agent before guest identities
|
|
@@ -51,10 +52,32 @@ def _open() -> None:
|
|
|
51
52
|
raise RpcError(failure, condition="connectors_failed")
|
|
52
53
|
|
|
53
54
|
|
|
54
|
-
def _portal():
|
|
55
|
+
def _portal(*, refresh_auth: bool = False):
|
|
55
56
|
from tools.connectors.portal.client import PortalConnectorClient
|
|
56
57
|
|
|
57
|
-
|
|
58
|
+
# Explicit writes retain native refresh; reads never acquire that authority.
|
|
59
|
+
if refresh_auth:
|
|
60
|
+
return PortalConnectorClient()
|
|
61
|
+
from tools.managed_tool_gateway import peek_nous_access_token
|
|
62
|
+
|
|
63
|
+
# The normal token reader may refresh and replace a dead guest. Page reads must never own auth writes.
|
|
64
|
+
def headers(_url):
|
|
65
|
+
token = peek_nous_access_token()
|
|
66
|
+
return {"Authorization": f"Bearer {token}"} if token else {}
|
|
67
|
+
|
|
68
|
+
return PortalConnectorClient(header_provider=headers)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _authenticated(client) -> bool:
|
|
72
|
+
from tools.connectors.gateway.errors import GatewayAuthError
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
client.require_authentication()
|
|
76
|
+
except GatewayAuthError as exc:
|
|
77
|
+
if getattr(exc, "code", None) == "NO_TOKEN":
|
|
78
|
+
return False
|
|
79
|
+
raise
|
|
80
|
+
return True
|
|
58
81
|
|
|
59
82
|
|
|
60
83
|
def _failure(exc: Exception) -> RpcError:
|
|
@@ -76,7 +99,7 @@ def _failure(exc: Exception) -> RpcError:
|
|
|
76
99
|
return RpcError("Connector rule change is invalid.", condition="policy_invalid")
|
|
77
100
|
if code == "connection_not_found":
|
|
78
101
|
return RpcError("Connector account not found.", condition="connection_not_found")
|
|
79
|
-
log.warning("connector request failed: %s", exc)
|
|
102
|
+
log.warning("connector request failed: %s", type(exc).__name__)
|
|
80
103
|
return RpcError("Connector request failed.", condition="connectors_failed")
|
|
81
104
|
|
|
82
105
|
|
|
@@ -93,20 +116,29 @@ def _slug(params: dict, key: str = "connector") -> str:
|
|
|
93
116
|
|
|
94
117
|
|
|
95
118
|
def catalog() -> dict:
|
|
96
|
-
|
|
119
|
+
client = _portal()
|
|
120
|
+
if _authenticated(client):
|
|
121
|
+
rows = client.catalog().connectors
|
|
122
|
+
elif callable(public_catalog := getattr(client, "public_catalog", None)):
|
|
123
|
+
rows = public_catalog().connectors
|
|
124
|
+
else:
|
|
125
|
+
raise RpcError("Sign in to Nous Portal to use connectors.", condition="connectors_sign_in")
|
|
97
126
|
return {"connectors": [row.model_dump(mode="json") for row in rows]}
|
|
98
127
|
|
|
99
128
|
|
|
100
129
|
def accounts() -> dict:
|
|
130
|
+
client = _portal()
|
|
131
|
+
if not _authenticated(client):
|
|
132
|
+
return {"accounts": []}
|
|
101
133
|
return {"accounts": [{
|
|
102
134
|
"connection_id": row["connectionId"], "connector": row["connector"], "status": row["status"],
|
|
103
135
|
"status_reason": row.get("statusReason"), "label": row["label"], "alias": row.get("alias"),
|
|
104
136
|
"active": bool(row["active"]), "disabled": bool(row.get("disabled")), "created_at": row["createdAt"],
|
|
105
|
-
} for row in
|
|
137
|
+
} for row in client.list_accounts()]}
|
|
106
138
|
|
|
107
139
|
|
|
108
140
|
def remove(connection_id: str) -> dict:
|
|
109
|
-
removed = _portal().delete_account(connection_id)
|
|
141
|
+
removed = _portal(refresh_auth=True).delete_account(connection_id)
|
|
110
142
|
return {"connection_id": removed["connectionId"], "connector": removed["connector"], "status": removed["status"]}
|
|
111
143
|
|
|
112
144
|
|
|
@@ -139,7 +171,7 @@ def set_policy(connector: str, expected_revision: str, *, enabled: bool | None =
|
|
|
139
171
|
The portal refuses the write when ``expected_revision`` is no longer its member revision."""
|
|
140
172
|
from tools.connectors.portal.policy import InvalidMemberPolicy, compose_connector_write, compose_tools_write
|
|
141
173
|
|
|
142
|
-
client = _portal()
|
|
174
|
+
client = _portal(refresh_auth=True)
|
|
143
175
|
client.require_authentication()
|
|
144
176
|
member = next((layer.body for layer in client.policy().layers if layer.kind == "member"), None)
|
|
145
177
|
try:
|
|
@@ -256,9 +288,9 @@ def remember_chat_operation(home: Path, payload: dict) -> dict | None:
|
|
|
256
288
|
|
|
257
289
|
|
|
258
290
|
def register(registry_) -> None:
|
|
259
|
-
def page(params: dict, read):
|
|
291
|
+
def page(params: dict, read, *, creates_guest: bool = False):
|
|
260
292
|
with scoped_home(profile_home_param(params)):
|
|
261
|
-
_open()
|
|
293
|
+
_open(creates_guest=creates_guest)
|
|
262
294
|
try:
|
|
263
295
|
return read()
|
|
264
296
|
except RpcError:
|
|
@@ -314,7 +346,7 @@ def register(registry_) -> None:
|
|
|
314
346
|
def connect_(ctx: CallContext, params: dict) -> dict:
|
|
315
347
|
slug = _slug(params)
|
|
316
348
|
home = profile_home_param(params)
|
|
317
|
-
return page(params, lambda: connect(home, slug))
|
|
349
|
+
return page(params, lambda: connect(home, slug), creates_guest=True)
|
|
318
350
|
|
|
319
351
|
def gated() -> None:
|
|
320
352
|
# Reads and moves on an operation pass the availability gate too, without creating an identity.
|
|
@@ -914,7 +914,8 @@ def register(registry) -> None:
|
|
|
914
914
|
|
|
915
915
|
@registry.method("cron.delivery_options", requires_agent=False)
|
|
916
916
|
def delivery_options(ctx: CallContext, params: dict) -> dict:
|
|
917
|
-
|
|
917
|
+
home = profile_home_param(params)
|
|
918
|
+
known: set = set()
|
|
918
919
|
for module_name in ("cron.scheduler_delivery", "cron.scheduler"):
|
|
919
920
|
try:
|
|
920
921
|
module = importlib.import_module(module_name)
|
|
@@ -922,7 +923,12 @@ def register(registry) -> None:
|
|
|
922
923
|
continue
|
|
923
924
|
candidates = getattr(module, "_KNOWN_DELIVERY_PLATFORMS", None)
|
|
924
925
|
if candidates:
|
|
925
|
-
known =
|
|
926
|
+
known = set(candidates)
|
|
927
|
+
# Agent 0.22.3+ keeps messaging platforms in the plugin registry; mirror its `_is_known_delivery_platform`.
|
|
928
|
+
plugin_platforms = getattr(module, "_iter_home_target_platforms", None)
|
|
929
|
+
if plugin_platforms is not None:
|
|
930
|
+
with scoped_home(home):
|
|
931
|
+
known.update(plugin_platforms())
|
|
926
932
|
break
|
|
927
933
|
platforms = [{"value": "local", "label": "Local (save output only)"}, {"value": "origin", "label": "Origin (reply to creator)"}]
|
|
928
934
|
platforms.extend({"value": name, "label": name.capitalize()} for name in sorted(known))
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"""Agent-owned dashboard discovery, consent and buffered HTTP. Never imports plugin code here."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import base64
|
|
5
|
+
import hashlib
|
|
6
|
+
import inspect
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import re
|
|
10
|
+
import stat
|
|
11
|
+
import tempfile
|
|
12
|
+
import threading
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from urllib.parse import parse_qsl, urlencode
|
|
15
|
+
|
|
16
|
+
from .. import home as homes
|
|
17
|
+
from ..errors import InvalidParams, RpcError
|
|
18
|
+
|
|
19
|
+
_NAME = re.compile(r'^[a-z][a-z0-9_-]{0,63}$')
|
|
20
|
+
_MIME = {'.html': 'text/html; charset=utf-8', '.js': 'application/javascript; charset=utf-8',
|
|
21
|
+
'.css': 'text/css; charset=utf-8', '.svg': 'image/svg+xml', '.png': 'image/png',
|
|
22
|
+
'.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.gif': 'image/gif', '.webp': 'image/webp',
|
|
23
|
+
'.ico': 'image/x-icon', '.woff': 'font/woff', '.woff2': 'font/woff2', '.ttf': 'font/ttf',
|
|
24
|
+
'.otf': 'font/otf', '.txt': 'text/plain; charset=utf-8'}
|
|
25
|
+
# An allowlist, rather than a denylist, keeps current and future gateway/Talaria credentials out.
|
|
26
|
+
_HEADERS = {'accept', 'content-type', 'if-none-match', 'if-modified-since'}
|
|
27
|
+
_QUERY_CREDENTIALS = {'token', 'ticket', 'internal', 'display_ticket', 'attach', 'profile', 'native_dial', 'api_key', 'access_token'}
|
|
28
|
+
_MAX_ASSET = 8 * 1024 * 1024
|
|
29
|
+
_MAX_API = 512 * 1024
|
|
30
|
+
# Resolve only the operator-selected launch home, never a plugin-controlled descendant.
|
|
31
|
+
_RAW_BASE_HOME = homes._PROCESS_HOME.parent.parent if homes._PROCESS_HOME.parent.name == 'profiles' else homes._PROCESS_HOME
|
|
32
|
+
_BASE_HOME = _RAW_BASE_HOME.resolve()
|
|
33
|
+
_SOURCE_LOCK = threading.Lock()
|
|
34
|
+
_SOURCE_DIRECTORY = None
|
|
35
|
+
_SOURCES = {}
|
|
36
|
+
_SOURCE_BYTES = 0
|
|
37
|
+
_SOURCE_CLOSED = False
|
|
38
|
+
_MAX_SOURCE_BYTES = 64 * 1024 * 1024
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def close_dashboard_sources():
|
|
42
|
+
"""Release the native loader's source cache after the RPC server has stopped admitting calls."""
|
|
43
|
+
global _SOURCE_DIRECTORY, _SOURCE_BYTES, _SOURCE_CLOSED
|
|
44
|
+
with _SOURCE_LOCK:
|
|
45
|
+
_SOURCE_CLOSED = True
|
|
46
|
+
if _SOURCE_DIRECTORY is not None:
|
|
47
|
+
_SOURCE_DIRECTORY.cleanup()
|
|
48
|
+
_SOURCE_DIRECTORY = None
|
|
49
|
+
_SOURCES.clear()
|
|
50
|
+
_SOURCE_BYTES = 0
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _api_source(root, api, source):
|
|
54
|
+
"""Give the unchanged native loader a private, stable copy of the bytes we verified.
|
|
55
|
+
|
|
56
|
+
Preserve the plugin module's original location for relative resources and tracebacks.
|
|
57
|
+
Content-addressing reuses its cached app; retain files through timeouts/late host work,
|
|
58
|
+
bounded by count/bytes and owned by the sidecar until shutdown.
|
|
59
|
+
"""
|
|
60
|
+
global _SOURCE_DIRECTORY, _SOURCE_BYTES
|
|
61
|
+
origin = str(Path(root) / api)
|
|
62
|
+
key = hashlib.sha256(os.fsencode(origin) + b'\0' + source).hexdigest()
|
|
63
|
+
with _SOURCE_LOCK:
|
|
64
|
+
if _SOURCE_CLOSED:
|
|
65
|
+
raise RpcError('Agent dashboard source cache is shutting down', condition='plugin_host_unavailable')
|
|
66
|
+
if key in _SOURCES:
|
|
67
|
+
return _SOURCES[key]
|
|
68
|
+
payload = (f'__talaria_source__ = {source!r}\n'
|
|
69
|
+
f'__file__ = {origin!r}\n'
|
|
70
|
+
"__loader__ = __import__('importlib.machinery', fromlist=['SourceFileLoader']).SourceFileLoader(__name__, __file__)\n"
|
|
71
|
+
"__cached__ = __import__('importlib.util', fromlist=['cache_from_source']).cache_from_source(__file__)\n"
|
|
72
|
+
"if __spec__ is not None:\n __spec__.origin = __file__\n __spec__.loader = __loader__\n __spec__.cached = __cached__\n"
|
|
73
|
+
"exec(compile(globals().pop('__talaria_source__'), __file__, 'exec'), globals())\n").encode()
|
|
74
|
+
if len(_SOURCES) >= 512 or _SOURCE_BYTES + len(payload) > _MAX_SOURCE_BYTES:
|
|
75
|
+
raise RpcError('Agent dashboard source cache is full', condition='plugin_host_unavailable')
|
|
76
|
+
path = None
|
|
77
|
+
try:
|
|
78
|
+
if _SOURCE_DIRECTORY is None:
|
|
79
|
+
_SOURCE_DIRECTORY = tempfile.TemporaryDirectory(prefix='talaria-dashboard-source-')
|
|
80
|
+
path = Path(_SOURCE_DIRECTORY.name) / f'{key}.py'
|
|
81
|
+
with path.open('xb') as file:
|
|
82
|
+
file.write(payload)
|
|
83
|
+
path.chmod(0o400)
|
|
84
|
+
except OSError as exc:
|
|
85
|
+
if path is not None:
|
|
86
|
+
path.unlink(missing_ok=True)
|
|
87
|
+
raise RpcError('Agent dashboard source unavailable', condition='plugin_host_unavailable') from exc
|
|
88
|
+
_SOURCES[key] = (str(path.parent), path.name)
|
|
89
|
+
_SOURCE_BYTES += len(payload)
|
|
90
|
+
return _SOURCES[key]
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _path(raw):
|
|
94
|
+
if not isinstance(raw, str) or not raw or len(raw) > 512 or re.search(r'[\s\\?#\x00-\x1f]', raw):
|
|
95
|
+
return None
|
|
96
|
+
# No encoded path components: the caller decodes once before this trust boundary.
|
|
97
|
+
if '%' in raw or any(not p or p.startswith('.') for p in raw.split('/')):
|
|
98
|
+
return None
|
|
99
|
+
return raw
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _asset_root(plugin, home):
|
|
103
|
+
root = Path(plugin['_dir'])
|
|
104
|
+
if plugin.get('source') == 'user':
|
|
105
|
+
allowed = {Path(home) / 'plugins', _RAW_BASE_HOME / 'plugins', _BASE_HOME / 'plugins'}
|
|
106
|
+
if root.parent.parent not in allowed:
|
|
107
|
+
return None
|
|
108
|
+
for base in (_RAW_BASE_HOME, _BASE_HOME):
|
|
109
|
+
try:
|
|
110
|
+
relative = root.relative_to(base)
|
|
111
|
+
except ValueError:
|
|
112
|
+
continue
|
|
113
|
+
return _BASE_HOME / relative, _BASE_HOME
|
|
114
|
+
return None
|
|
115
|
+
from hermes_cli.plugins import get_bundled_plugins_dir
|
|
116
|
+
bundled = Path(get_bundled_plugins_dir())
|
|
117
|
+
if root.parent.parent not in {bundled, bundled / 'memory'}:
|
|
118
|
+
return None
|
|
119
|
+
# The Agent source is trusted; its plugins directory and every descendant are still opened no-follow.
|
|
120
|
+
anchor = bundled.parent.resolve()
|
|
121
|
+
return anchor / root.relative_to(bundled.parent), anchor
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _read(root: Path, rel: str, limit=_MAX_ASSET, *, anchor: Path):
|
|
125
|
+
"""Open from the trusted home/source, rejecting symlinks in every root and asset component."""
|
|
126
|
+
if not _path(rel):
|
|
127
|
+
return None
|
|
128
|
+
fd = None
|
|
129
|
+
try:
|
|
130
|
+
relative = root.relative_to(anchor)
|
|
131
|
+
if any(part == '..' for part in relative.parts):
|
|
132
|
+
return None
|
|
133
|
+
# Even an ancestor replaced after anchor canonicalization cannot redirect this traversal.
|
|
134
|
+
parts = [*anchor.parts[1:], *relative.parts, *rel.split('/')]
|
|
135
|
+
fd = os.open(anchor.anchor, os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW)
|
|
136
|
+
for i, part in enumerate(parts):
|
|
137
|
+
child = os.open(part, os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK |
|
|
138
|
+
(os.O_DIRECTORY if i < len(parts) - 1 else 0), dir_fd=fd)
|
|
139
|
+
os.close(fd)
|
|
140
|
+
fd = child
|
|
141
|
+
if not stat.S_ISREG(os.fstat(fd).st_mode) or os.fstat(fd).st_size > limit:
|
|
142
|
+
return None
|
|
143
|
+
with os.fdopen(fd, 'rb') as file:
|
|
144
|
+
fd = None
|
|
145
|
+
body = file.read(limit + 1)
|
|
146
|
+
return body if len(body) <= limit else None
|
|
147
|
+
except (OSError, ValueError):
|
|
148
|
+
return None
|
|
149
|
+
finally:
|
|
150
|
+
if fd is not None:
|
|
151
|
+
os.close(fd)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _supported():
|
|
155
|
+
if not getattr(os, 'O_NOFOLLOW', 0) or os.open not in os.supports_dir_fd:
|
|
156
|
+
return False
|
|
157
|
+
try:
|
|
158
|
+
from hermes_cli.plugin_host import PluginHost
|
|
159
|
+
from hermes_cli.web_server_plugin_profiles import _scan_profile_plugins # noqa: F401
|
|
160
|
+
return 'authenticated' in inspect.signature(PluginHost.asgi_request).parameters
|
|
161
|
+
except (ImportError, AttributeError, ValueError):
|
|
162
|
+
return False
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _plugins(home):
|
|
166
|
+
from hermes_cli.web_server_plugin_profiles import _scan_profile_plugins
|
|
167
|
+
from hermes_cli.web_server_dashboard import _plugin_api_mount_skip_reason, _plugin_enable_sets_here
|
|
168
|
+
enabled, disabled = _plugin_enable_sets_here()
|
|
169
|
+
out = []
|
|
170
|
+
for plugin in _scan_profile_plugins(home):
|
|
171
|
+
name = plugin.get('name')
|
|
172
|
+
if not isinstance(name, str) or not _NAME.fullmatch(name) or plugin.get('source') not in ('user', 'bundled'):
|
|
173
|
+
continue
|
|
174
|
+
located = _asset_root(plugin, home)
|
|
175
|
+
if located is None:
|
|
176
|
+
continue
|
|
177
|
+
root, anchor = located
|
|
178
|
+
raw = _read(root, 'manifest.json', 64 * 1024, anchor=anchor)
|
|
179
|
+
try:
|
|
180
|
+
manifest = json.loads(raw) if raw else {}
|
|
181
|
+
except (ValueError, UnicodeDecodeError):
|
|
182
|
+
continue
|
|
183
|
+
if not isinstance(manifest, dict):
|
|
184
|
+
continue
|
|
185
|
+
# The existing Web protocol's panel opt-in distinguishes Web documents from native Desktop SDK bundles.
|
|
186
|
+
panel = manifest.get('panel')
|
|
187
|
+
compatible = isinstance(panel, str) and len(panel) <= 256 and _path(panel) and panel.startswith(('dist/', 'static/')) and panel.endswith('.html')
|
|
188
|
+
out.append({**plugin, '_dir': str(root), '_asset_anchor': str(anchor), 'panel': panel if compatible else None,
|
|
189
|
+
'enabled': _plugin_api_mount_skip_reason(plugin, enabled, disabled) is None})
|
|
190
|
+
return out
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _named(home, name, *, require_panel=True):
|
|
194
|
+
return next((p for p in _plugins(home) if p['name'] == name and p['enabled'] and (p['panel'] if require_panel else p.get('_api_file'))), None)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _reply(status=404, body=b'', content_type='application/octet-stream'):
|
|
198
|
+
return {'status': status, 'body': base64.b64encode(body).decode('ascii'), 'content_type': content_type}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _request(ctx, plugin, params, *, require_panel=True):
|
|
202
|
+
ctx.check_cancelled()
|
|
203
|
+
if params.get('authenticated') is not True:
|
|
204
|
+
return _reply()
|
|
205
|
+
path = params.get('path', '')
|
|
206
|
+
rel = path.lstrip('/')
|
|
207
|
+
if path != '/' and (_path(rel) is None or path != '/' + rel):
|
|
208
|
+
return _reply()
|
|
209
|
+
headers = [(k.lower(), str(v)) for k, v in params.get('headers', {}).items() if k.lower() in _HEADERS]
|
|
210
|
+
if params.get('websocket') or any(k == 'accept' and 'text/event-stream' in v.lower() for k, v in headers):
|
|
211
|
+
return _reply(501, b'Agent plugin host supports buffered HTTP only', 'text/plain; charset=utf-8')
|
|
212
|
+
api = plugin.get('_api_file')
|
|
213
|
+
if not isinstance(api, str) or not _path(api):
|
|
214
|
+
return _reply()
|
|
215
|
+
source = _read(Path(plugin['_dir']), api, anchor=Path(plugin['_asset_anchor']))
|
|
216
|
+
if source is None:
|
|
217
|
+
return _reply()
|
|
218
|
+
from hermes_cli.plugins import get_plugin_manager
|
|
219
|
+
body = base64.b64decode(params.get('body') or '', validate=True)
|
|
220
|
+
if len(body) > _MAX_API:
|
|
221
|
+
return _reply(413)
|
|
222
|
+
query = urlencode([(k, v) for k, v in parse_qsl(params.get('query', ''), keep_blank_values=True)
|
|
223
|
+
if k.lower() not in _QUERY_CREDENTIALS])
|
|
224
|
+
method = params.get('method', 'GET')
|
|
225
|
+
if method not in {'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'}:
|
|
226
|
+
raise InvalidParams('Unsupported plugin HTTP method')
|
|
227
|
+
root, snapshot_api = _api_source(plugin['_dir'], api, source)
|
|
228
|
+
ctx.check_cancelled()
|
|
229
|
+
try:
|
|
230
|
+
result = get_plugin_manager()._plugin_host().asgi_request(
|
|
231
|
+
plugin['name'], root, snapshot_api, method, path, query, headers, body,
|
|
232
|
+
timeout=10.0, authenticated=True)
|
|
233
|
+
except TimeoutError:
|
|
234
|
+
ctx.check_cancelled()
|
|
235
|
+
return _reply(504)
|
|
236
|
+
except Exception as exc:
|
|
237
|
+
# Third-party errors may contain credentials or file paths.
|
|
238
|
+
raise RpcError('Agent plugin request failed', condition='plugin_host_unavailable') from exc
|
|
239
|
+
ctx.check_cancelled()
|
|
240
|
+
content_type = next((v for k, v in result.get('headers', []) if k.lower() == 'content-type'), 'application/octet-stream')
|
|
241
|
+
if 'text/event-stream' in content_type.lower():
|
|
242
|
+
return _reply(501, b'Agent plugin host supports buffered HTTP only', 'text/plain; charset=utf-8')
|
|
243
|
+
if _named(homes.profile_home_param(params), plugin['name'], require_panel=require_panel) is None:
|
|
244
|
+
return _reply()
|
|
245
|
+
raw = result.get('body', b'')
|
|
246
|
+
if not isinstance(raw, bytes) or len(raw) > _MAX_API:
|
|
247
|
+
return _reply(502)
|
|
248
|
+
status = result.get('status', 502)
|
|
249
|
+
return _reply(status if isinstance(status, int) and 200 <= status <= 599 else 502, raw, content_type)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def register(registry):
|
|
253
|
+
def run(ctx, params, action):
|
|
254
|
+
ctx.check_cancelled()
|
|
255
|
+
if not _supported():
|
|
256
|
+
if action == 'list':
|
|
257
|
+
return {'supported': False, 'plugins': []}
|
|
258
|
+
if action == 'toggle':
|
|
259
|
+
raise RpcError('Agent dashboard host unsupported', condition='agent_incompatible')
|
|
260
|
+
return _reply(501)
|
|
261
|
+
home = homes.profile_home_param(params)
|
|
262
|
+
with homes.scoped_home(home, load_plugins=False):
|
|
263
|
+
if action == 'list':
|
|
264
|
+
return {'supported': True, 'plugins': [
|
|
265
|
+
{'name': p['name'], 'label': str(p.get('label') or p['name'])[:80],
|
|
266
|
+
'version': str(p.get('version') or '')[:40], 'description': str(p.get('description') or '')[:300],
|
|
267
|
+
'enabled': p['enabled'], 'panel': p['panel'], 'has_api': bool(p.get('_api_file'))}
|
|
268
|
+
for p in _plugins(home)]}
|
|
269
|
+
name = params.get('name')
|
|
270
|
+
if not isinstance(name, str) or not _NAME.fullmatch(name):
|
|
271
|
+
if action == 'toggle':
|
|
272
|
+
raise InvalidParams('Unknown Web dashboard plugin')
|
|
273
|
+
return _reply()
|
|
274
|
+
if action == 'toggle':
|
|
275
|
+
plugin = next((p for p in _plugins(home) if p['name'] == name and p['panel']), None)
|
|
276
|
+
if plugin is None or not isinstance(params.get('enabled'), bool):
|
|
277
|
+
raise InvalidParams('Unknown Web dashboard plugin or invalid enablement')
|
|
278
|
+
from hermes_cli.plugins_cmd import _activate_key, _resolve_plugin_key
|
|
279
|
+
key = _resolve_plugin_key(name)
|
|
280
|
+
if key is None:
|
|
281
|
+
raise InvalidParams('Plugin is not installed')
|
|
282
|
+
# Use the Agent admission transaction, without activate_plugin_now (in-process imports).
|
|
283
|
+
_activate_key(key, enable=params['enabled'])
|
|
284
|
+
return {'ok': True}
|
|
285
|
+
plugin = _named(home, name)
|
|
286
|
+
if plugin is None:
|
|
287
|
+
return _reply()
|
|
288
|
+
if action == 'request':
|
|
289
|
+
return _request(ctx, plugin, params)
|
|
290
|
+
path = params.get('path', '')
|
|
291
|
+
if not isinstance(path, str) or not path.startswith(('dist/', 'static/')):
|
|
292
|
+
return _reply()
|
|
293
|
+
content_type = _MIME.get(Path(path).suffix.lower())
|
|
294
|
+
body = _read(Path(plugin['_dir']), path, anchor=Path(plugin['_asset_anchor'])) if content_type else None
|
|
295
|
+
ctx.check_cancelled()
|
|
296
|
+
return _reply(200, body, content_type) if body is not None else _reply()
|
|
297
|
+
|
|
298
|
+
for action in ('list', 'toggle', 'asset', 'request'):
|
|
299
|
+
def handler(ctx, params, action=action):
|
|
300
|
+
return run(ctx, params, action)
|
|
301
|
+
registry.method(f'plugins.dashboard_{action}')(handler)
|
|
@@ -80,7 +80,7 @@ def _host_serves(home: Path, budget_deadline: float) -> bool:
|
|
|
80
80
|
time.sleep(0.5)
|
|
81
81
|
|
|
82
82
|
|
|
83
|
-
def control(action: str, home: Path, cli_profile: str | None, ctx: CallContext, *, quick_timeout: float, background_wait: float) -> dict:
|
|
83
|
+
def control(action: str, home: Path, cli_profile: str | None, ctx: CallContext, *, quick_timeout: float, background_wait: float, interrupt: bool = False) -> dict:
|
|
84
84
|
if action not in ACTIONS:
|
|
85
85
|
raise InvalidParams("unsupported gateway action")
|
|
86
86
|
if not _ACTION_LOCK.acquire(blocking=False):
|
|
@@ -94,7 +94,7 @@ def control(action: str, home: Path, cli_profile: str | None, ctx: CallContext,
|
|
|
94
94
|
if left <= 0:
|
|
95
95
|
return {"status": "failed", "message": f"Gateway {action} ran out of time before it could start", "timed_out": True}
|
|
96
96
|
quick = min(quick_timeout, left)
|
|
97
|
-
return _run(action, home, cli_profile, ctx, quick_timeout=quick, background_wait=left - quick)
|
|
97
|
+
return _run(action, home, cli_profile, ctx, quick_timeout=quick, background_wait=left - quick, interrupt=interrupt)
|
|
98
98
|
|
|
99
99
|
result = run(action, home, cli_profile)
|
|
100
100
|
root = _host_root(home)
|
|
@@ -164,7 +164,7 @@ def _restart_wait(home: Path, cli_profile: str | None = None) -> float:
|
|
|
164
164
|
return _RESTART_FALLBACK_SECONDS
|
|
165
165
|
|
|
166
166
|
|
|
167
|
-
def _run(action: str, home: Path, cli_profile: str | None, ctx: CallContext, *, quick_timeout: float, background_wait: float) -> dict:
|
|
167
|
+
def _run(action: str, home: Path, cli_profile: str | None, ctx: CallContext, *, quick_timeout: float, background_wait: float, interrupt: bool = False) -> dict:
|
|
168
168
|
"""One ``hermes --profile <name> gateway <action>`` subprocess for ``home``; the caller holds ``_ACTION_LOCK``."""
|
|
169
169
|
try:
|
|
170
170
|
profile = cli_profile or _profile_selector(home)
|
|
@@ -180,6 +180,15 @@ def _run(action: str, home: Path, cli_profile: str | None, ctx: CallContext, *,
|
|
|
180
180
|
if profile:
|
|
181
181
|
cmd.extend(["--profile", profile])
|
|
182
182
|
cmd.extend(["gateway", action])
|
|
183
|
+
try:
|
|
184
|
+
from hermes_cli import gateway_lifecycle_guards # noqa: F401 - installed CLI capability
|
|
185
|
+
except ImportError:
|
|
186
|
+
pass
|
|
187
|
+
else:
|
|
188
|
+
if interrupt and action in ("stop", "restart"):
|
|
189
|
+
cmd.append("--yes")
|
|
190
|
+
if action == "restart":
|
|
191
|
+
cmd.append("--detach")
|
|
183
192
|
log.info("Running gateway %s via %s (HERMES_HOME=%s)", action, " ".join(cmd), home)
|
|
184
193
|
try:
|
|
185
194
|
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, env=env)
|
|
@@ -203,6 +212,8 @@ def _run(action: str, home: Path, cli_profile: str | None, ctx: CallContext, *,
|
|
|
203
212
|
return {"status": "completed", "message": f"Gateway service {_DONE[action]} successfully", "detail": stdout or stderr}
|
|
204
213
|
failed = {"status": "failed", "message": f"{action.capitalize()} failed: {stderr or stdout}", "detail": stdout or stderr, "returncode": proc.returncode}
|
|
205
214
|
reason = _reason(stdout, stderr)
|
|
215
|
+
if proc.returncode == 1 and action in ("stop", "restart") and reason and re.fullmatch(rf"Refusing to {action} the gateway: \d+ live session\(s\) would be interrupted\.", reason):
|
|
216
|
+
return {**failed, "status": "busy_live_work", "reason": reason, "message": reason}
|
|
206
217
|
return {**failed, "reason": reason} if reason else failed
|
|
207
218
|
|
|
208
219
|
ctx.emit("progress", {"phase": "started"})
|
|
@@ -238,14 +249,23 @@ def register(registry) -> None:
|
|
|
238
249
|
|
|
239
250
|
return session(ctx, params)
|
|
240
251
|
|
|
252
|
+
@registry.method("gateway.create")
|
|
253
|
+
def create_(ctx: CallContext, params: dict) -> dict:
|
|
254
|
+
from .gateway_sessions import create
|
|
255
|
+
|
|
256
|
+
return create(params)
|
|
257
|
+
|
|
241
258
|
def run(ctx: CallContext, params: dict, action: str) -> dict:
|
|
242
259
|
home = profile_home_param(params)
|
|
243
260
|
cli_profile = params.get("cli_profile")
|
|
244
261
|
if cli_profile is not None and not isinstance(cli_profile, str):
|
|
245
262
|
raise InvalidParams("cli_profile must be a string")
|
|
263
|
+
interrupt = params.get("interrupt", False)
|
|
264
|
+
if not isinstance(interrupt, bool):
|
|
265
|
+
raise InvalidParams("interrupt must be a boolean")
|
|
246
266
|
# A restart drains the old gateway first, for as long as the CLI's own budget allows (infinite: no deadline).
|
|
247
267
|
wait = params.get("background_wait_seconds") or (_restart_wait(home, cli_profile or None) if action == "restart" else 60.0)
|
|
248
|
-
return control(action, home, cli_profile or None, ctx, quick_timeout=float(params.get("quick_timeout_seconds") or 2.0), background_wait=float(wait))
|
|
268
|
+
return control(action, home, cli_profile or None, ctx, quick_timeout=float(params.get("quick_timeout_seconds") or 2.0), background_wait=float(wait), interrupt=interrupt)
|
|
249
269
|
|
|
250
270
|
@registry.method("gateway.control", requires_agent=False)
|
|
251
271
|
def control_(ctx: CallContext, params: dict) -> dict:
|