From 80f104e90154e98cc73e99a20ea9e2717cfd65ce Mon Sep 17 00:00:00 2001 From: "applefather.eth" <161012565+applefather-eth@users.noreply.github.com> Date: Thu, 14 May 2026 11:35:14 +0700 Subject: [PATCH] Prepare Obsidian community plugin package --- .gitignore | 3 + LICENSE | 21 + README.md | 64 + logo.png | Bin 0 -> 10057 bytes main.js | 12338 ++++++++++++++++++++++++++++++++++ manifest.json | 10 + package.json | 17 + scripts/package-release.mjs | 67 + styles.css | 1844 +++++ vault-pet-mascot.png | Bin 0 -> 215436 bytes 10 files changed, 14364 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 logo.png create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 scripts/package-release.mjs create mode 100644 styles.css create mode 100644 vault-pet-mascot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23ab61b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +dist/ +.DS_Store +node_modules/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fec8889 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 OpenAgentMarket + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..da68211 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# OpenAgent + +OpenAgent is an Obsidian plugin for running local AI agent workflows from your vault and Canvas. + +It connects Obsidian to a local OpenAgent daemon so you can start Codex tasks from selected Canvas nodes or notes, track active threads, write results back to Canvas, and keep agent work anchored in your vault. + +## Requirements + +- Obsidian desktop +- Community plugins enabled +- A local OpenAgent daemon running on your machine +- Codex Desktop or a compatible local Codex/OpenAgent setup + +OpenAgent is desktop-only because it uses local filesystem access and a local daemon connection. + +## Install + +After this plugin is published in the Obsidian Community directory: + +1. Open Obsidian. +2. Go to **Settings -> Community plugins**. +3. Search for **OpenAgent**. +4. Install and enable the plugin. + +For manual testing, download `main.js`, `manifest.json`, and `styles.css` from a GitHub release and place them in: + +```text +.obsidian/plugins/openagent/ +``` + +Then enable **OpenAgent** in **Settings -> Community plugins**. + +## Local Daemon + +OpenAgent expects a local daemon to be available. The plugin can start the daemon when configured, or you can run it manually from the OpenAgent project: + +```bash +pnpm dev:daemon +``` + +The plugin stores local daemon configuration under your home directory at `.openagent/daemon-config.json`. + +## Privacy And Security + +OpenAgent is local-first. The plugin communicates with a daemon running on your machine and sends the selected note or Canvas context you choose to use for an agent task. + +The plugin may: + +- Read selected notes and Canvas nodes in your vault. +- Write task results, follow-up nodes, and metadata back to your vault. +- Read and write local OpenAgent configuration under `.openagent`. +- Communicate with a local HTTP daemon using an authentication token. + +The plugin does not include its own payment system. It may connect to local tools or services that require separate accounts, API keys, subscriptions, or usage-based billing. + +## Development + +This repository is the publishable Obsidian Community plugin package. The broader OpenAgent project lives at: + +https://github.com/openagentmarket/openagent + +## License + +MIT diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aec405efac08e2d88639d539464f587a311aaaf1 GIT binary patch literal 10057 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 Mr!HF~Z4vsv0Kh;WumAu6 literal 0 HcmV?d00001 diff --git a/main.js b/main.js new file mode 100644 index 0000000..03e08a5 --- /dev/null +++ b/main.js @@ -0,0 +1,12338 @@ +"use strict"; + +const crypto = require("crypto"); +const fs = require("fs"); +const http = require("http"); +const os = require("os"); +const path = require("path"); +const { spawn } = require("child_process"); +const { fileURLToPath, pathToFileURL } = require("url"); +const { + ButtonComponent, + editorInfoField, + ItemView, + Modal, + Notice, + Plugin, + PluginSettingTab, + Setting, + setIcon, + setTooltip, + TextComponent, + TFile, +} = require("obsidian"); +let EditorView = null; +try { + ({ EditorView } = require("@codemirror/view")); +} catch { + EditorView = null; +} + +const VIEW_TYPE = "openagent-view"; +const VOICE_GRAPH_VIEW_TYPE = "openagent-voice-graph-view"; +const DAEMON_CONFIG_PATH = path.join(os.homedir(), ".openagent", "daemon-config.json"); +const DAEMON_LOG_PATH = path.join(os.homedir(), ".openagent", "daemon.log"); +const PLUGIN_LOGO_FILE_NAME = "logo.png"; +const PLUGIN_LOGO_PATH = path.join(__dirname, PLUGIN_LOGO_FILE_NAME); +const VAULT_PET_MASCOT_FILE_NAME = "vault-pet-mascot.png"; +const VAULT_PET_MASCOT_PATH = path.join(__dirname, VAULT_PET_MASCOT_FILE_NAME); +const DEFAULT_PLUGIN_LOGO_DATA_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAeGVYSWZNTQAqAAAACAAEARoABQAAAAEAAAA+ARsABQAAAAEAAABGASgAAwAAAAEAAgAAh2kABAAAAAEAAABOAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAgKADAAQAAAABAAAAgAAAAAB7ATBAAAAACXBIWXMAAAsTAAALEwEAmpwYAAAmO0lEQVR4Ae2dCZhdRZXH3/769ZZ0Op2dEEIChCUSEoZVJQjBQUPYoqOCMrJ8is4oKAygQFBRR0WMfnzIsIgDjhBEcEE0gIBhhCSGhEAGw5qk00k6nd73t87vX+/Wze22k3SS3ujc+r56tZ06VXXq1KlTy60XCPjGp4BPAZ8CPgV8CvgU8CngU8CngE8BnwI+BXwK+BTwKeBTwKeATwGfAj4FfAr4FPAp4FPAp4BPAZ8CPgV8CvgU8CngU8CngE8BnwI+BYYJBYLDpB27bUYulwtOnDgx0dbWVpFMJiuy2eyIYDA4MhwOhzKZTACbCYVCjTiNxcXF2xOJxI6qqqp2YHK7RTwMEoclA6jDy8vLJ7W3t8+hU0/CHkvcIdgK+qwUa9pNOO8xoXwUaU10fA12I3ZVKBpdWZxILK+trd1MeNgzxHuap0eNGjWpoKDgsnAk/AQjutbpMHXavls6XbgikcgT0Wj0Uhhr4nuaSN0q/56XABrthaWFJ6Y70pcx0udnc9kK092ehsIIGtWbsBuJ3oTo35pOp2twmQ2yATo4TFoF+ceQfjA4p2APxl+C68EUEGw1sL+Ox+P3tba2rsLfFaALtB/oNwpA9SBz9QmMzEfphBQFqSOMJaw5/VXSbo/FYguQCofMnj072tvKCFZ5YoWxc6ORyA/B9Qo40xa/XMIdSIT/KSwsPK63eH24PqKARD3Ev5NOaFdnWEu4ik5fDGOcMmXKlAJvcYzkYGlp6ajiWGwGnftBOm4BEuBiWfmJOw1mORolsEKw3rxHHXVUDJwnglvMsNmWJ5cyW6LRyI+KiirGefP4/n6ggDqGjvoUnSBR7nY84Q2xWORaOnK8t1jN13TqBXTyj7HLxCDYDqw6zs1vw7id2GpgV2Dvg8kuKSkpOcyLs6ioaCyMcHUoFHynWx3egkku7M483ry+fz8oUFZWNoIOuatbxzXSGd9i1GruNkajlfn5I8A+HAwFa4h0O3pf/JTXAjP8CXyfRqqMzJcSCEhSqGzSmyxe/FngFo8dO7bIwvluH1AA0T2NTvirJbRcwk8VFUWPteinTZsWRzpcRPwKL5PYPIoLBkPbkBZrIuHIk15RHgwEW+nMJ8m7nPhKYLvoFBYHaW9E49EvixltuUidWeR72sLIJfzMyJEjp1gY390PCkDg4yH826AwI5nOSdJZizTSLVpG/JkQ/YVgsOtoB1ajdynw10ov0Kg97bTTIhLT5Pm1B+fmioqKYsXTcSMp8zjSryTvb8FRb+GsS31eY2o5324jiPko41ZgXUVRzMJ04TKoravv7gUFGNHvDzEnW8JD4B0Q/jyLQkodIvcOL+EFS/htOuSmWKx4Rk9zssMAj3nwVuEfZfF63REjRhwKruvo0NctvFzKyIWj0XvFVBaeun2c+DoLR54taoNN9929oAAj9mSIud0SE/9G4k6yKAqj0dkQ+GWbLpc5fxMM8SWNYgvXs5sL0lmP2LxIDmn2iZ5h87Ga18F9JfV41+aTSx1epV4n2rz4TwWm0sKgLFYTd4JNH2pul+XOUKkcmvcRbLIsZZPmINVJnc8oPDeVSq1RmM6T/x5GcrmT3oq4vhut/zvbtm2rYZlYStrIdFu6uDPXKaVwBNvCCWBi2EI6LdrZ2fllNoNmOfkbEkWJG9ASWgLZbKYjmWymzFRBQaS9szPTyChuZ5OoacaMGTs2btxY0djQcG06k7mUMoqd/PUwxxWcM/xKYfyzwP046ZMVpryNTAfzmpub31DYN7uhwMSSknLvyKYjaqKF0Tk2C8S9hLgOwla7z8Acz0WikR/Qub8j71qslnva/esELo1rYfN6xM68XeI9OPNw+XzKr4OhevBuoIyXsA9HQpG1XniVVVAQvZw4Y5BQc5i+XAlGnpVMJ2U23Xd7oMCiwCLOXqK/IMl2QAej9yMWlLSLIXTSpvfWJY/Fp7nbdCh5vZp+lvhWOrjFcVPePHtRToo6ukxA3ecJn80PE/xi0aJFIcJDxgypKQDiXYFov8tSh5F9LaL0+wpDzLMQsb9GrBbadIgrr6RBPX6WeDrFC7BXH65m+qgmfy1uA3ibM5lONnmiafB0EN/a1NS0GHwfFgLy6gj4bBS6ho6ODvggVMwUUUhZWjHoPKAIOxpbDux4cE4g27hcLjuWlYCmIa0ghEq4kmJUcC9RGP+VtOkO+WXi0ejnO1Opn+ZD/q9LAa311RFEmNHKaHnUjpbS0vh0FLwtNg04de41zKtnlcRLDtdqYOHChWE6oVcMLbiuSmCwyru2dyu1G49wSNcoGFEwFaY6kzot89SvTstXkx042nK/Nw1Gm2HS/J+dFIBID1siMXdWMSKNAjiFPX3SnrVpEFrTwj/vzLlvvmg09pAHZ9WECRNcybIvGKnvROomJc8wMNLoVTGmcGmpSNpbNo32/NYyt9IH0/RqxPR3BR3x/gSjKqyyEJuXIjbvk5+RfgPTwK3yyxB2p4V8DBR3Rv706dNjO3bsSCC+S4ArJJ927KKI7FL8nAPFJCW0gRRDRF9JvF0FNJL2DeLbhJPO0oZOB+nSE7S924RfK4Mkq4F6cLei0DXp1pADb+Q/yuqsVHv6GSpklD06+h7gjU5gVi7J5KMAhiB6LhqLLaQOjyr/AW109AqhXoAIZuTgX2aPbiHaDIje6ElbqpNAiVfSzqdjrgL+x3TIY8rH3L0OeN3cacCaK124ZtPG4tgX1+LAzWBbsTWU9QZlvkTZf6Aed8cikevVyVhXktHR0jnOokwZTQXu7iP51+yv1MmjfY//QqCPisA0w2johOfZJkGwBxRvLXC61KELGVkbtydXuGWB0x2BFLaNcANhLREt7jTxWyhvC+520mtJq8PVUlKrDq0SgM3X05PP5ndd4NztYMGBb9WkSZMS+APoLDNJd1cFMM5nFT+YZlCnAM2D3/zmN/+EmDxDRKADnrvxxhs/RHyWUT6HzZsXENnxHgmEuk/lbWfugLBSIMUc25CyWhXURSKhGkS3lneNTAEdzMVpyuigvA5WAT/GXSDcysN8fapWAUw9kZaWlnAb08rIeDxKuARRLSlVBJ4y8FVk0+nRcKBWBePJPkEudjR+bUBpiuli6OjLwHOvIsFzP+V+Rn7wvTJ58uQTN2zYoJXMgWckyiG+ux5HfF5gqRCOdtGc2yHcC9gHELm3APdJlK4T4/HSaVK0dMBj8/XWFS5gzcilDlXS6Hub1wtHhwelqHKYNI56HYUE+wh1vAb8L1n8KLWvWXGvAyLKMxdZcHPkOc+L74Dyc93qBy6RQqH1lkgoWFMhjjv3Q6TvidB7QxzBO5q2mCM66aSTEocffngJnTVSO3J0kNbplgEkAaazBV1urRhLcJz0laqDgY0IX2/rEcuLe3fHkjZ8AhwqUbrA74yPkOM3SYPxs1dE7csK6nClpqZmNSJ1uvAyar6LmL5efhSq65Lp9HfkhxEaWKPPrKurq9Raf+nSpRKz5YjUUeQtx7IZkxsLaDnuKMSqtP8S3Dh5yxC3UdIYhMEYNg6MGEKrgZFYMzcT1hyveV+6hYwYQ2XLlYRqo5xOcKIEhjjty8nfTLx0hO3gkb6guwbbsfWEa2CgOlYkv6T8+cBJ9D+NX/qNRv351P9R4FRGG+FZrFy0hDxwDAcsH6DxRpnDTUukq/XOquBveM3ohKA6CPoRBPw9/jXASsuXJt5rRdDiGgiXemmloFXIm9hKWyb+DsT/MYQD2nSiLRtsGpcJvqr4wTB7PXf2VSUZUWcyAowEgjhvIBHWoAwFXn/99ZmkzbTl4J+M/ZINe13yiQl0x68VbmkEmZZ+DZzodYQikQZGXDOMk2TUso7PmBEMvO79tSIlPkW6OaYl3BiJxRaRTxp6lM7R1m8B5Up6SGQX4y/C6jRxFKO3AJgSwqXkBTbAqaA5GYyRT3v92n+QdQ3x8VSqU/P9q/X19Y3geRL/5wSQzuXmM738UMqvwsPeqOMhwLM01IxyFL57bKMZ7ZoGTDxuOhQM/R3YP2MfIu32SDz+Fc2nSJDTUSKP06VNmGeM9AdJD+EWLuvK35MJsUlDvCmHTtxC3l7tBFq8cnUrSaN59OjR47W9q5UL9TqD+n2Kul6D9v8TdgTd3UHasNwqrFIWbfnMT83Se3qq57CMM1ujfGBhCQChLsk31DDG0zaeUfbyzLEzNRr7XFcB9322HDEAa/UebwTl67Xvv07bLKO1w7CHC1tR0Zix9tIqjcsxBeaVxH0vap9yDsoUgOg9nCFaoRpD/DREegWxClGKx7S17RT/dNKf11av1Xy/V42zDEM+vHnmmTNnToSTviDKVpDRll29erVEtTUhiXi0fbMVrEhGcI5RmjvyyCMzS5YscTaC8pJFeG3GPbmM+ueYbpqph04VC6jDKeRZ39q6XdfPX+bT1HlCxl6D4n+5J3x9nT4oDABBptmOoW+rYYANahidMA0Sa0PFGO7vPANjBI8++ujopk2bpNmXEi7LBDOjQ9nQyGw2jeYfLCVfMZ2iOVorgQj4isCj+TlCHhmzAgCpOWvAzQJnDptUEP5ybhI9i1e7eNZkyZdZv359CmbQ/QCtBtKI9yQdxxI1x7FytA1mrgNOukcjtgm/VgW1xDcAW8fSc/uaNWteI3ySEFPHU3EkfcT82ivQykDmOPIR1Xvmymd7D/5C0FupthGLEPMF/GaI03FX2njcDGlLsc9B1NcgzFasDmSkZZu8HtghE1bdHCum0Lby37H1tq74VwWcjSsYZIEnfpumRsIDagZFAsDpXoVnIy1WB8qY+THvDejb/TMdf48OxLTx0p6T4NWo1TffyVw2p02YDNaIb2B1EyhjWC0XzGYyaS505OzlUZ0FSFmTK5pow0caPfsFymGmEX1Aqn0EWe0raAqJY00liMMLpOPi1eaRbPdOnZpYvnw8W4GVTDHrkWidwik42nsIbg12wMyAMwCNDSIBxtkWQsgq+Z14VywTr/n4dTqEjZeADm/0zb5cfardiChtwW0iXzMjSUe3LVy6TKJk5bBihg4uluoAyDAFq4Qs63CzzNLcvmzZsrsh+EXgkyiuPeigg85Am9/R2DgmNGlSe5CNp/CWLVukG8iv7wrDaPzxxsbGeENDQ4gyo+DRlBTLZtl8yqXKKCvOaxPaYNKKQmcFYjAxwATK0r1GMYuWh2pnZbg8vI0dDU0ZCodymcx03BXY4Wu0mwehVtFCI7Yh5H+otRBBS8PlNp7O/b2zlavkPjeUdT9ITR1ggK28IKKrXf1idITtMK9t88dUkEOLl/GaeNp8Xb9UYDdIvZrwbsD6LmnlypVaq7trbphBy8GAnnBhtLlLMQi2sT83RpDUmh6s0TJMSl6/GPYH9FjFdoucdkrUBx555BHpM6b9CkOXSXIH0gz4FMAuWIKD3JKcM+1DDKbDQABxrb37Qohg2o/7jiUEfnP2O2f2nAirgThnCCFEcgRRX8jTLRLFQfDoyFa7d+y4pcJYMzcLRyIaDbGus+gUn+O9IHcaIhyvrq7+APikrDkmHWjXmiCVMqMTBTWH1ZSSpAwtTblm2pnli7JUY2NSx8tpppAcilyKHU1zh0D1xuQqKyt1EXUr2CTi1dET5TrGZQDC3fUFC9NvrkuVfiuhG2LmUJUZVTTE0Xq7kzWw1sG6WcvyLW+YM8+OhqOHZgPZ0cAUsYArz602hzelQISZ73VunyBPRGt7xYFPuLtcDiU90MJDUN2N4q3BPwpcOqHrYgyTAqZ6Up8Aa3hxYoZ408EA56qqkinydzK7p2HGLPqC7ijoDoKWj7W8Q6XDngZgNM9bM8Z6QqFAk60ej5W4S2Cb3t/ugDMANyQhT6t2aDQSRNhONZLLH+pEd9SSdnoqkzp9VwSw+b3piuvJ7CreC7s7GE8a609zmujSzZOGTMu3SXjFMNZkMkb3tEExlBgXR0vGMEpuHhZmKEin8/EucD973Ib0czk70be0OMI/P7Jswvjx44OIYW2U2Cgz8gho00ZUEZW0tNOyTkBiHGn7aQCzaJYS2BqZqUxGIzQreF3Jyi//8ps8ghGXpClnDnYyfpWTYvp4GlwavWJOOdo0MhIFV3qLHhSSziQlNkK6lm4xOlowgpdUKzIMYpaORsrFiFMeLStxXONKOjbFzBSoFHAUzp07V+WqngNiBpwBijk3QwCY0S+iYEUkSQA5rgRgvr2NTvlNLBbqaG9PZZjnOxGpLYh7KU5ZlmSd5EkhctOTJk7McQiTveiii9TpWa/yCIFdnCrAGnDdh/8ShcHXcvDBB1/y1ltv7XINDozbg8J5yy23hB988MGwPiTZnN0cLOsoi3Ty3SFKiKagEDAFMId0mgjt0BuFXyWsjR+1WQyUx5fNunhhsIj0G8EMlBlwBhg5clK6rW0LJ6D5dkMUbZYE6Fii8pEQRx+ArkExXNahMY9Bqct7nF8I6oY3b95s/HS8G2c9LqFthOPSKXZb2MTQkdoudjujG3iXoAOnUeqO1LqAtisCTa1dID2BUOBcGyK/pBoO5XFciNgzSUiWAIzcqzpYXPvrDii3OZXVUNdtGmNotBGHjGiJXyMGxAeMbldMWtg+drtyVEmJK4r7uJx8O+lpD16XcWi/lxE75s+fn1cIPMD96R1wCcAdu1TVlipnXCMOg/lTwUxmSzuDwh3WEGZM2YQJE1NNTQlGJ9cHI1riFSNaI9ygCSFCzLIPuAhxcc3FDGqC+u4iYHbwYCQz/xLuMqo0ApEoR3gIG2+orLyM0afrXMojHMqjYWqGJ3gpPstmndHodJdPuog6UgdFupSi28aCzSK9WqmzWSqy+9hGWe1ILCa/vKEMt52cVpVabiB/q3f6svDDyqXx2vFbRqMMgenY76qB3XfFIGgLRK/nzFzE0i0eKXPqEGPpI9evOItvoFxbj124YgTVWV+amg9XYSm1w9QT/eZB/MaQficeS4s/ONED5gy4BBDBwuGILmAaA0OYta/O3GEGbZbMUgLxughiYJyw67ceT7KNGjDXW7ceCpUE0WGS2qHVQjeTc3cFGQy63GrSgd3RDbDfgwPOAPkW5ao8LTO7YnnGCIsBjCHcwOh4GeJo983hBJZ74ZA56CFeWqOkJ16jSSO7gUOAk1d5TBrpZjmoOME6NsO0sYB8MwnrA41ORuVd4GshGGG0Mo+Yo0bNzxHg5Gq30XstXJ0sazagwBHDJhDjUaziCZqbyYXki3A6OR12MHoNfOG2kzR39w9mqCYvWYe5iURi19JEI/Yg0lr7LSAS4AZP/LrTevjgg04y6/T9JRHE/pktC3/9EUccsV+HQbZecm3d5GdOD3F3sJh2/t2Wl+AxKcHoTiHx62w8S92vKH4gzaBIAHbmN1jFBxk5nv19EV/36rk8IfFvpoCJyzk3J77SSxBJCm94P/wa1dYE2cvXAZU7NdmE3ro91cuJy3EaWAYzjBMuExcOb5Kf94Y4GnbeOZLY4ftExQ+kkcY74IYLAe9ACCPr6M1RrPcnqRJoz29AIrs80wcgU/qxcrYcUwQndu7KpK/LZEkrRtYZhoy+eDJMncwlx8Ps+RPQ/BuHGw3EAP4MigSA0zcy0mtp/Bg6WbtmWpL9jWXYxrbW1iqYYorEJ/E3IhbXkiZGNSOfOdO4Zq7Ez6RuRa6JRw8w0MAZdYB0xQtG28KOyz5xJvtPxBmTy2YT77777q0E1DkefCo2a8Lkdbep5XcMCm2IKckG8y5KgVE2MjpJZPnIQdcRao9SYfxKLppWr1rFlYhUYDrx5mCMpCaOpCudHdE8ouH6K2Iw7/6F9ol0Oma93baV+Mdt/HB0ad8S21Z0nkW2jTDVOu/rpxamv12Xlfu7IC9+Mw8GAq/YOEbrbDtCwuHgX208rtmIAV4jZ4/Wk6/PvZS+x/J3UUfD5LZCwKy0ftp8rPUT/+a6det0mDWgZlCmALWQkfASYvyL8sMARzMHazm4ORyOLkM9yEAcLa/04tan8W9iepDSpmWYpgzt+unQxcSBx8Q7SygrwoVai8BgICx1w+h8fBAUVjpTQOZq7CkCYfTxpnDsKl6EkRJI6YLO5DL8OicG2vkTqBH21Eth+YU4xz1lFn4Zs+xkVJtLqAY2TTnBzBjE+gPUVVfXc6S/RP0DXB4p4SDLLEOB1VpytVGKFDgQDDdnjoQgUrzMCGGuP0ft1idedMibNh4G+Izi+9rQgT8Hpymb8uoOO+ywfrmMQbvOhgW1/yAdZIu9ewjDz6L9UkTNjibh+X3dxt7gG5QpQBXj+PUtCKC1sTGMijPl4SauDoWez8ca6XC+9fex26Xt7NX3sGO3/yXSrgWwmZFKtGslD0uZpWYmkzoRqWAlMP86En1t/0vbewy2Anufcz9zaL5jFL4AmvcJFTtlc/XsOmfynTzm9URHR/ZSCKTp4QOJWOJjuVBuKyNIBy6NHB2nWFunmRbadfWba2YZXujI8txKp07T2HwhqwZ3z4aOYFPOfPdvAfQZmK52mY6ykV6XPAHwBql3kM/KIlwNj+1g6ikpTEei7dFCxDnfrcbDiPgi6leEmyBPOYdCH7Z4OLf6szNNqV1zd8aHXp83b94mLonaqAFzd9nggagB6/5zk6nUY2bnh6k3kSg4lfnyJb3O0dzSvBamkF4g9Ysfdag5mdNWsC6FaM7VFGLmXsISpy2kSZGSuNVcLF1C6XwibuCNKGYfmOk2eCxcMJk0KXd6POp5XOETTYxOgas7AtrTj3A3UYKcoLkpJGmhO4xSDKSrmO1e/ErXBRczsEjHmzfE632A47l7+JpeM2fj6VWYYJJSGf2LOTH8sgN64DgQZCyEqaHFZi5m1HzLtp5Pxu+z8cPBRdot14mn2oek0Muips1y4/HCjyp+MMygSgA1GML8CrF4gfyMwnVTp06drWkAIn2YDZQnnVGkjzJvY8ToEYhyrtNUMNZKcUcx/PR4g87aRdwCrL1wGYKtQoxnbbS4hzj5QWlGpuC9eoAkhUmgU/Bi6Bx8ur0j6ZLX+PP3A3R5REe9imslvRlg5vacbgPXEdZBFvtAqWvwlwCj2883og8YBse/GP+/Kx646jFjxhyjZ+4VHmhjRNVAF+otDwL8xjIAxJrB9a5TSX+GOf15FML/I+5IwojgQDNE+47NSzz9FMydx6h68cUXY2PHZoM1NZE4ylwCvSBYlkiEeNgnzD0R3mfOhmGmEFbZ9fBfLpjKfIuZxNzRow6N7MJd0Nqa2h4zNxTzjADT6a4hxab1ukia6Smnz8u0bVyRruisjdVmjz/++JQ+8LD1sXM8ec8jrsgUyE0n8DyG+A/ozUDadZZtBwPgL4PV+bYOg+o604DOx41I5JrPz22FGCk32Hg6YHNffj3LTax7PbhrWH725TIQwWQUXNMmOvkpMYjahWSbB+MaXQTpJAb7tOIHy3hF4KDUgdFaTef+0RaeyWbno+EfpHBxceQXEKtBfsT8RDTqy7RSsMRU/L6bLhq/Ef37jiufU/WawpNyjP75SJeTLT7+oORBSSuFkSaftPXn+Zs6mPppCzcYrjPZDUbRO8tkVJyV7Ox8EgqZ+jDyr4dQ5qoYo0df8V4maIiob+43YusJ1mH1Zq++ENbDDFoB6MvhVuZeuUnwNrNEbLeiHBhp++ayCMu222Eqcy5PXC2vhsylLA6o+HbcTB2ZeFNHR4RPloJIKa0GSmFAnd/rppK+BC5C7o9mBBVRPx1njyZfGe4Y7ERgpJeozptY1RxLPeqZOiYwjawlTfDS/pdQV1MHhQ9Yo1ENQXU2oFGiJdx6/Y2bCBKNFh4HEbU8M2l7dPMjzd4XlJKmD0h0aVMbTHpgQgqaPtaUImdxalnJW3+hWtL05p9e+2hTPuXHr4ufFnavXP7RVKeMxvCfg1fhMfmFrzBWeK6T5DuMVpc4IhKj47OWKoxMnaBZwvNyWHADBFRHqXNMZ3vSLVz/u8zhTvmqUzPM8y7hRlsX/E20a5ra4Wxxa7fP1EtMrscylTaYZkhMASIAYnYcGvwaxONYhSGQ+5AyovN4ROcy0rQBk+UN569ESmMPMSGUM1XoIQYuj6RHcNTCKxupYs6aKxDHhXSAHmsowmW1kyvkkIf8Wb3uwd6T+Yv4MpUFEdLB/Ash2mRSF2VD4ZAkkcK8G21eBuVRigDLvEAj4TqYUlfI62BUubVMM5IehewQPkXZE4TXmb6ukJ9rYAvbnb+RUZgp6mbq/g35feNQAKJ8H687ciGuqyFDzP+2aVwVf0e7hXsmXF7Ro4PsPcKQNmNkMQ9YfHRcNS+ETNAdRGezJqy7fJ58ey4KCHDeYXHCZC0wxVFORn3D8L+etIYRBQVTnTTfsRSQuIRwrgilY9ZKdCodbVl/HtGE1zAIzPJDm29fXDrkfouLcrbt7zKQfYRTqZ+rq4D/LlsvGGGBhI4tzynbJvuulwIQxx1FIhiK0xdtOp3+n4qThdhthK9HtJ7Pww7vh8hHSsvWy526WbOn0Us591hcYgDd3LXldHeFS3GSDpq3tXcBs06n00+kzPnRgoJLqc8rgNi67bAvfzpvH//Vk9apKU34hoIZMjqAJUZJPH5YSzK5EqKXKg7CVkLwOeyibaejy3FXkNZFfAIjUGn70tz133/S4vVFjubrdjpY27NK06MNrSzbtKv4ceJOIE5l6E3h7+FtA1bbydpe1tKvQA9UoGbqK98RWB0AjSRddZNkMtKJOLw7DWV8DfzfVgzT2MUs9TR9GUM5j5N2Pri7ZrIAvmsUpNuggxlNciHoDyxdGOmf8KYNNT8MtMYuYSWNWFqut3Wk05NIjVNsW4aCO+QkgIgiUY7Wv4qRNU5hCNcG4T7IKuFvsEUwHAkvYRRfqDSMnpq9Gym9id23SYTHMXp1yqhDmBHYBFYjWIc/OvuQ1SogJNdjtD2rsuSI+dKyhM0xM/4O8jTSwbLVAGxlOVHHaP43lUe68qaYGs5mw8js7sG4i0i/WWky1PNhziM+AZzw+2Z3FICQV5MuQhmL6Hx29uz820Lsnx8METfbNPyr2D42U4bFKY1eI1HKHcfvBzMnH6praHTCLOxx4HvSk38H5Z1J/GylwYCzpHRqHte29JSRU0Y6yqhdTZhiIrHI1/Bos8nUkf8vXmwS+CmOFR9FvVyFFn8rEmGmTffdPVBABGekrQLMZQI6x700wVRwIUR1iU+H/sH+O9ceUJtk4H9ucYNnK8fQkha9NtTlYoSFpISpH3Vdq4seQrBwoVaEOxlMMMD/RGm+2QsKMNLPoHMkgg2R8TegEL7PokDE/simyYXo92r9btN35wIrxczi3TKF/xLaHbw3DWnxUerS4snfrBWBhaGzv2DT5LLJtLlw9GizOWRhhoo7JHUAL3HoqDuZ7z9n4wivQCx/iLd0WiQleFjq96TP9aT/ic5Zx4jcobma+bkeW0un8IRPuAmNPIWIT/LM3G3Mz0aPAH47cWdodcD8HaaDAQ2X6G4B/hLm/lHYMcCVAzMWfFpBmIseIiDPk+sPou9UHWDQY8j3POll+ToFefYlcnlHR+qefNj/3SsKsPQbTUe6mjSZNdJdcZpIjDqI9NcVvztL52nvQIdCurWjZaK7aUM+DoNC+p+fZvwa2To4cqeX3eHl6RJJIWN015+LAC8RcOtCXZ+UPuKA+M6+UMCZCnZ2GJ1ZUBA1e+zCp1FHh7lKIVHqAF0E1QPTfKy/byd5jG4xjdl0whVzuB0rP537K/s5FyM+GM3/9Y0Lo/Jh4MOBHbJmyE8BlnJo3Delk+lbbBji6gXOC7mCLW1eS6wTEOmP0RHjFSa9HR3hp9iHENmjSBsbCUVKU7nMKG73xnii8hxuHR/twLYC9zPEe4OunvB+gZZ8dcEsJ3yJ2NZQNn1oR0fyOvAcKngZOv9ptPrz+Ws4MYYOd66hDG0mGUP5inP/BNvG++4+UsDZUn2c7N4RVh3lj6MsSjEBhN/kheFbsIeQIIdYGOsyDfyXhSNPj38aJdGNuZr0HRZWLp2/VLuSFpc2p4BxlVXBUJf7bLrv9hEFWJtX0HFrRGBrIfzbdIA9ddOh0VHArLbpcoGpp0MWM1UcK1FNnI6bf2phSK+yS0ilwzBTgf8SMO7rHRaWzn9Qc71wyKA8nkv+VrxunYBZYZeEBsj/6TsKaIOG4+Auo1xMQIe5y8Nx48ZV0AncJ9zZKeog4PQfxC+iuC3m0uYKxTnx9Yz0m0m7A7sMOHcDxwOjF7+/7hwXE63O1ylfV1h2BzcjHY4wAP5P/1CANbeOXmvA7o46wpsZuXNtiWYkR6P/SnwXZvHm6a0fptDjFS5ulQHDfQbcXUY+EqMBBv2g0n3TzxRgNJ5OB9RSjJcJmlgdXM7hnBHzqgLMMgnY7wO7zQvbGz953qSjr7KHO8InCcA9v5tI67JMJNzCdHCOYHwzQBSgY+dC+C6SgKKlpN3DSNTtXNfACBPpzC+Q9kdGqpaHLuMApOlBVjeGK4FZgl5xUfd5PJEom8xB1KOC91penmkC/jy3MN8zcBSgY0+g0972doj8xK2nU/6l+9awpgaUuPHkO4WO/jg7fZ9HvF8B7AWM4Nk9XTXTqJfIB+fGHsrZgnJ5xsC12C/pHyjAqd0hdOZT3TtHYeKfoZPP0dXzf8i4hwjlgTEWgOPZXeBeoU2oPaDxkweCAhzm6IucbyPGd+4YOqJa4p3Ru5r0myUxdFHDLge9dVOcxD4wJwL7dfK83NMuIviySIQ7YTxnv9+L5b3ld5Wl91a1d11bxPkHOJj5dibL+z+aqbsZdR7Lw83s/b9JUiWdrk0e7ezpKvlkwodiDxIzdMtqgjDFa/F45Kb29uRjPaX7cUOAAhLdMMLldNYrGv1Uab8tuN5hKvlqWdne3RsYAuQ4cKug4+JEIraQ1cLjjPi6vWUEmEcbR89JSbSPOw03avYo5oZbIyXOdbWLs/6TuZN3Mh17DOJeFzT0hq/+EEqHR3pSRkfC+h+/9bzns5wvkF7g3sA64nqYTIYblQ6g9oghtPePBj+WZk+UZQk4Xhs+SjuASOE31aeATwGfAj4FfAr4FPAp4FPAp4BPAZ8CPgV8CvgU8CngU8CngE8BnwI+BXwK+BTwKeBTwKeATwGfAj4FhicF/h8LpB+2U3Gk4QAAAABJRU5ErkJggg=="; +const DEFAULT_VAULT_PET_MASCOT_DATA_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAEAAElEQVR4nOz9B7xt910fiH5XX7vvfco9t+jqXl0VW10usiVjW9iWC8U2tkcyZQJJSGIySd6bPEJIQhwhSiBA5r2XNyQwmc+kkDBgOc4L1SGJHdkYy8hgXHCTLOn20/fZffU1n+/v91/7HAPJEGLAktZPPr7nnrL3Wmvvu37tW4A66qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo4466qijjjrqqKOOOuqoo446vqrD+tM+gDrqeJ7+myv/ED/bANAG4ANwze+uArgdwJ2WZW0EjSDwfR+NRgjfC+B4DlzXhe/48Dwfrm/DcW3LtfyO7djHLdc66zhO2ypsPRAbKMoSZZbvZEVxPsvz3TxLF1lSlGVZIE1jJFmKLM2QxAniJEYUR1YSJXmapnMAFwB8AsDnACwA5OaDn88AJF+ha1FHHXV8haMuAOqo40/239gflOyY4PsAmgAC8/dzlmW9uN1u39jutLutVstttpthq9FeaXfb1/R7/UG/30ev30Ov20Gn3ULYbCIMQ/0IAgR+ANdx4EpR4KO0LDiOA9u2YVs8MD20vKyOKkee58iyHGmSo8hTRPECcZIgimLMZgvMZ3OMx2NMJhPs7u5jb7iD6WRyZTqZXokW8/FkMksmk0kynoz38iz/XVMcbAJgsTACMAGQ/RGvUx11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CKPhEMNev+50Ooz6dcIwQOiHohj0vEAmf+kHWkMeIQkq4Y91Xm7tqhdEwCU8Mwj4ESotUCKgRO4q2bDl44sCwAQdqRpAJQmc6ilBlKwD8ebRGGQ5BNApsEGTV5UU/myxwHyRYXpx4R6fnODoeB/HR0dnJydnt05Ojt4s8+xLAL48GAzujsfjM/N6WAMfC4vvMWwDYGHx3jcC+A4ZIZuBa67r/lgYdf5iFEd/PummPzToj/pLwyUMh8vo9bpNN02bMIkQhjHCMHAY0sMTgeO5DhUE9ATwGCpEYx8RAegJgRJAdfpj0A/9COj6b+KMDZNfij/leS4Z+hpQpG/QBIhxwCQckjognrwoGQ9clAzkaYo8Q5bluJhO3bPTU4xPT3FycoKz05OTyeTi7YvpxRv5fP4VAF8yjn1t0ScME9Hq+C0svtewDYCFxfsra6D5Ls3Adbj4S54f/4U4jH8kSdKPJ51uv9freb3h0On3Buh1UqRp3IRxiDiKmjCKnJDZAF4gun8nUEtiXxIHTf6A0f4Zkr9xEiA5T537eRpQowBO/Ercq7nXrxm/WyEv66bKC6cocsyzBaaLhTO5uMDR8RHOz85wfnZ6cTGdvJNli7em55P7TVORyPcNs94/+y72yiYUwMLC4vsB2wBYWLw//06636Ug6pkA+GG47qUgiJb9INwJo+TPJVG4EyVpnHY7Xr8/8Dppik6SSnSwHzEkiIFAAQLfF9Mfkgs9GvC6YsEjX9R3vPZ+z2uAxPFyl89pPy8r5EWOPFuoD3+eYzqdYja5qGaTaTWZTJr5YpLPF/O7i2zxWj7PbldVcRvAa2bKPweQf8fzfPa+bwu/hcX3GbYBsLB4/+KZNKD/z0rcNed8Egmv6ZbAX/M8bz3w/Bcc3/+RIAhXkzjygyhs2ACEbTpgECCMfNfj0cBzQyfwHFr5iud+Wed1U5VlWVdlwYm/BCd8Fv8sW4grX1EUjAA+rMv8taqs3iiq4qguy6mZ6t81zP3xdxT8Zx83YYu+hcV7DNsAWFh88P6u/lGFUwZ5ACOjLqDcsPPUCID/C+GF4iQYeDVWajg/CAfPo4bvwLnreHijQr2H2llUUr4Z5JOTCfjs154D2DeF/ghcFvzRN/tnCY9/3GO3sLD4PsM2ABYWH96G4E/yOQYA1gz57hDAyZ8BAc9K9ywsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCzwp8T/C6pj/dcwsvlUAAAAAElFTkSuQmCC"; +const DEFAULT_SETTINGS = Object.freeze({ + automationFolder: "", + daemonLaunchCommand: "", + daemonLaunchCwd: "", + daemonSandboxMode: "workspace-write", + enableDebugLogging: false, + enableDevSmokeRequests: false, + enableVaultPet: true, + stopActiveTaskHotkey: "", + workspaceRoot: "Workspaces", +}); +const REPO_WORKSPACE_DIR_NAME = ".openagent"; +const WORKSPACE_CONFIG_FILE_NAME = "workspace.json"; +const DEFAULT_WORKSPACE_CANVAS_FILE = "Main.canvas"; +const WORKSPACE_AUTOMATION_DIR_NAME = "Automations"; +const DEFAULT_DAILY_VAULT_REVIEW_AUTOMATION_FILE = "Daily Vault Review.md"; +const DEFAULT_DAILY_VAULT_REVIEW_CWD = "/Users/applefather/Documents/Applefather"; +const WORKSPACE_INDEX_WAIT_MS = 4_000; +const WORKSPACE_INDEX_POLL_MS = 100; +const CANVAS_EDITOR_TEXT_CACHE_TTL_MS = 10_000; +const DAEMON_SANDBOX_MODE_OPTIONS = Object.freeze({ + WORKSPACE_WRITE: "workspace-write", + DANGER_FULL_ACCESS: "danger-full-access", +}); +const RECENT_SELECTION_TTL_MS = 15_000; +const DEV_SMOKE_REQUEST_RELATIVE_PATH = path.join(".openagent", "smoke-request.json"); +const DEV_SMOKE_RESULT_RELATIVE_PATH = path.join(".openagent", "smoke-result.json"); +const DEBUG_LOG_RELATIVE_PATH = path.join(".openagent", "new-thread-debug.jsonl"); +const DEV_SMOKE_POLL_MS = 1_000; +const MAX_DEBUG_EVENTS = 30; +const DAEMON_STATUS_POLL_MS = 10_000; +const ACTIVE_TASK_STREAM_RECONNECT_DELAY_MS = 1_500; +const RESULT_NODE_Y_GAP = 40; +const RESULT_NODE_MIN_HEIGHT = 160; +const RESULT_NODE_MAX_HEIGHT = 520; +const RESULT_NODE_DEFAULT_WIDTH = 420; +const RESULT_NODE_MIN_WIDTH = 320; +const RESULT_NODE_MAX_WIDTH = 720; +const RESULT_NODE_CHARS_PER_LINE = 52; +const FOLLOW_UP_NODE_DEFAULT_HEIGHT = 120; +const CANVAS_LAYOUT_BASE_X = 80; +const CANVAS_LAYOUT_BASE_Y = 80; +const CANVAS_LAYOUT_X_GAP = 180; +const CANVAS_LAYOUT_Y_GAP = 80; +const CANVAS_LAYOUT_COMPONENT_GAP = 220; +const CANVAS_LAYOUT_MIN_WIDTH = 260; +const CANVAS_LAYOUT_MIN_HEIGHT = 120; +const RUNNING_CANVAS_NODE_COLOR = "3"; +const COMPLETED_CANVAS_NODE_COLOR = "#086ddd"; +const CANVAS_NEW_THREAD_BUTTON_ID = "oa-canvas-new-thread-button"; +const CANVAS_FOLLOW_UP_NODE_BUTTON_ID = "oa-canvas-follow-up-node-button"; +const CANVAS_FORK_NODE_BUTTON_ID = "oa-canvas-fork-node-button"; +const AUTO_RUN_TRIGGER_CANVAS_NODE_COLORS = Object.freeze([ + "4", + "#22c55e", + "#16a34a", + "#008000", +]); +const OPENAGENT_CANVAS_SCHEMA_VERSION = 1; +const CHAT_MESSAGE_PAGE_SIZE = 20; +const SETTINGS_RECENT_TASKS_PAGE_SIZE = 10; +const PANEL_TAB_OPTIONS = Object.freeze({ + ACTIVE_TASK: "active-task", + WORKSPACE_SETTINGS: "workspace-settings", + HEARTBEAT: "heartbeat", + WORKSPACE: "workspace", + TASK_LIST: "task-list", + ARCHIVED_TASK_LIST: "archived-task-list", + DEBUG: "debug", +}); +const DAEMON_CONNECTION_STATES = Object.freeze({ + UNKNOWN: "unknown", + CHECKING: "checking", + ONLINE: "online", + OFFLINE: "offline", +}); +const HOTKEY_CAPTURE_INPUT_CLASS = "oa-hotkey-capture-input"; +const CANVAS_SELECTION_TRACKING_PATCH_SYMBOL = Symbol("openagentCanvasSelectionTrackingPatch"); +const VAULT_PET_WIDTH = 118; +const VAULT_PET_HEIGHT = 142; +const VAULT_PET_MARGIN = 14; +const VAULT_PET_ACTIVITY_COOLDOWN_MS = 1_200; +const VOICE_GRAPH_MAX_NODES = 120; +const VOICE_GRAPH_MAX_EDGES = 260; +const VOICE_GRAPH_MIN_NODE_RADIUS = 4; +const VOICE_GRAPH_MAX_NODE_RADIUS = 24; +const VAULT_PET_IDLE_PHRASES = Object.freeze([ + "Bloop. I live here now.", + "Your vault has snacks?", + "One badge, many thoughts.", + "I am guarding this thought.", + "Tiny splash break.", + "Today we make the graph wiggle.", +]); +const VAULT_PET_ACTIVITY_PHRASES = Object.freeze({ + create: [ + "New note! Fresh plankton.", + "I saw that file hatch.", + "A baby idea just appeared.", + ], + modify: [ + "Nice. The vault is breathing.", + "Ink deployed.", + "That note got juicier.", + ], + delete: [ + "Poof. I will not ask questions.", + "The deep takes one back.", + "Clean water, clean vault.", + ], + rename: [ + "New name, same soul.", + "Identity upgrade detected.", + "That file got a little hat.", + ], + workspace: [ + "New room smell.", + "I am recalibrating my halo.", + "Different pane, same tiny ocean.", + ], + pet: [ + "Hehe. Again.", + "Critical morale upgrade.", + "Tentacle high five.", + "I will remember this.", + ], +}); + +function shortHash(value) { + return crypto.createHash("sha256").update(String(value || ""), "utf8").digest("hex").slice(0, 12); +} + +function sleep(ms) { + return new Promise((resolve) => window.setTimeout(resolve, ms)); +} + +function pickRandomItem(items) { + if (!Array.isArray(items) || items.length === 0) { + return ""; + } + return items[Math.floor(Math.random() * items.length)]; +} + +function isUsableClientRect(rect) { + return Boolean( + rect + && Number.isFinite(rect.left) + && Number.isFinite(rect.top) + && rect.width > 0 + && rect.height > 0 + && rect.right >= 0 + && rect.bottom >= 0 + && rect.left <= window.innerWidth + && rect.top <= window.innerHeight + ); +} + +function combineClientRects(rects) { + const usableRects = Array.from(rects || []).filter(isUsableClientRect); + if (usableRects.length === 0) { + return null; + } + const left = Math.min(...usableRects.map((rect) => rect.left)); + const top = Math.min(...usableRects.map((rect) => rect.top)); + const right = Math.max(...usableRects.map((rect) => rect.right)); + const bottom = Math.max(...usableRects.map((rect) => rect.bottom)); + return { + left, + top, + right, + bottom, + width: right - left, + height: bottom - top, + }; +} + +function patchObjectMethod(target, methodName, wrap) { + if (!target || typeof target !== "object") { + return null; + } + + const original = target[methodName]; + if (typeof original !== "function" || typeof wrap !== "function") { + return null; + } + + const wrapped = wrap(original); + if (typeof wrapped !== "function" || wrapped === original) { + return null; + } + + target[methodName] = wrapped; + return () => { + if (target[methodName] === wrapped) { + target[methodName] = original; + } + }; +} + +function shellEscape(value) { + return `'${String(value || "").replace(/'/g, `'\\''`)}'`; +} + +function slugifyWorkspaceName(value) { + return String(value || "") + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + || "workspace"; +} + +function joinVaultPath(...parts) { + return parts + .map((part) => String(part || "").replace(/^\/+|\/+$/g, "")) + .filter(Boolean) + .join("/"); +} + +function parseAutomationScalar(value) { + const raw = String(value || "").trim(); + if (!raw) { + return ""; + } + if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) { + return raw.slice(1, -1); + } + if (raw === "true") { + return true; + } + if (raw === "false") { + return false; + } + return raw; +} + +function parseAutomationFrontmatter(raw) { + const text = String(raw || ""); + if (!text.startsWith("---\n")) { + return { data: {}, body: text }; + } + + const endIndex = text.indexOf("\n---", 4); + if (endIndex < 0) { + return { data: {}, body: text }; + } + + const frontmatter = text.slice(4, endIndex).trim(); + const body = text.slice(endIndex + 4).replace(/^\n+/, ""); + const data = {}; + frontmatter.split(/\r?\n/).forEach((line) => { + const match = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line); + if (!match) { + return; + } + data[match[1]] = parseAutomationScalar(match[2]); + }); + return { data, body }; +} + +function dirnameVaultPath(value) { + const normalized = String(value || "").replace(/^\/+|\/+$/g, ""); + if (!normalized || !normalized.includes("/")) { + return ""; + } + return normalized.slice(0, normalized.lastIndexOf("/")); +} + +function isVaultPathWithinRoot(vaultPath, rootPath) { + const normalizedVaultPath = String(vaultPath || "").replace(/^\/+|\/+$/g, ""); + const normalizedRootPath = String(rootPath || "").replace(/^\/+|\/+$/g, ""); + if (!normalizedVaultPath || !normalizedRootPath) { + return false; + } + return normalizedVaultPath === normalizedRootPath || normalizedVaultPath.startsWith(`${normalizedRootPath}/`); +} + +function safeRealpathSync(value) { + try { + return fs.realpathSync.native ? fs.realpathSync.native(value) : fs.realpathSync(value); + } catch { + return ""; + } +} + +function pathExistsOrIsSymlink(value) { + try { + fs.lstatSync(value); + return true; + } catch { + return false; + } +} + +function getDirectorySymlinkType() { + return process.platform === "win32" ? "junction" : "dir"; +} + +function normalizePanelTab(value) { + if (value === PANEL_TAB_OPTIONS.WORKSPACE_SETTINGS) { + return PANEL_TAB_OPTIONS.TASK_LIST; + } + if (value === PANEL_TAB_OPTIONS.TASK_LIST) { + return PANEL_TAB_OPTIONS.TASK_LIST; + } + if (value === PANEL_TAB_OPTIONS.HEARTBEAT) { + return PANEL_TAB_OPTIONS.HEARTBEAT; + } + if (value === PANEL_TAB_OPTIONS.WORKSPACE) { + return PANEL_TAB_OPTIONS.WORKSPACE; + } + return PANEL_TAB_OPTIONS.TASK_LIST; +} + +function normalizePromptPath(value) { + return String(value || "").trim().replace(/\\/g, "/"); +} + +function normalizeFilesystemPathForCompare(value) { + return normalizePromptPath(path.resolve(String(value || "").trim())); +} + +function encodeMarkdownLinkPath(value) { + return String(value || "") + .split("/") + .map((segment) => encodeURIComponent(segment).replace(/[()]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`)) + .join("/"); +} + +function decodeMarkdownLinkTarget(value) { + const normalized = String(value || "").trim(); + try { + return decodeURI(normalized); + } catch { + return normalized; + } +} + +function parseLocalMarkdownLinkTarget(rawTarget) { + const target = String(rawTarget || "").trim(); + if (!target) { + return null; + } + + const hashIndex = target.indexOf("#"); + const targetWithoutFragment = hashIndex >= 0 ? target.slice(0, hashIndex) : target; + const fragment = hashIndex >= 0 ? target.slice(hashIndex) : ""; + const decodedTarget = decodeMarkdownLinkTarget(targetWithoutFragment); + let localPath = decodedTarget; + + if (/^file:\/\//i.test(decodedTarget)) { + try { + localPath = fileURLToPath(decodedTarget); + } catch { + return null; + } + } + + if (!path.isAbsolute(localPath)) { + return null; + } + + let normalizedPath = localPath; + if (!fs.existsSync(normalizedPath)) { + const lineSuffixMatch = normalizedPath.match(/^(.*):\d+(?::\d+)?$/); + if (lineSuffixMatch && path.isAbsolute(lineSuffixMatch[1])) { + normalizedPath = lineSuffixMatch[1]; + } + } + + return { + localPath: normalizedPath, + fragment, + }; +} + +function rewriteMarkdownLinks(text, rewriteTarget) { + const source = String(text || ""); + if (!source || typeof rewriteTarget !== "function") { + return source; + } + + return source.replace(/(\[[^\]\n]*\]\()(<[^>\n]*>|[^)\s\n]*)(\))/g, (match, prefix, rawTarget, suffix) => { + const target = String(rawTarget || ""); + const unwrappedTarget = target.startsWith("<") && target.endsWith(">") + ? target.slice(1, -1) + : target; + const rewrittenTarget = rewriteTarget(unwrappedTarget); + return rewrittenTarget ? `${prefix}${rewrittenTarget}${suffix}` : match; + }); +} + +function createDaemonStatusSnapshot(overrides = {}) { + return { + state: DAEMON_CONNECTION_STATES.UNKNOWN, + checkedAt: 0, + host: "", + port: "", + error: "", + runtimeAvailable: null, + runtimeMessage: "", + lastRuntimeError: "", + ...overrides, + }; +} + +function formatDaemonStatusError(message) { + const normalizedMessage = String(message || "").trim(); + if (!normalizedMessage) { + return "Can't reach the local Codex server."; + } + + const lowercaseMessage = normalizedMessage.toLowerCase(); + if (lowercaseMessage.includes("config was not found")) { + return "Codex server is not configured yet."; + } + if (lowercaseMessage.includes("not responding") || lowercaseMessage.includes("unable to reach")) { + return "Can't reach the local Codex server."; + } + return normalizedMessage; +} + +function getDaemonStatusTagClassName(state) { + switch (state) { + case DAEMON_CONNECTION_STATES.ONLINE: + return "is-online"; + case DAEMON_CONNECTION_STATES.OFFLINE: + return "is-offline"; + case DAEMON_CONNECTION_STATES.CHECKING: + return "is-checking"; + default: + return ""; + } +} + +function normalizeHotkeyModifierToken(value) { + const normalized = String(value || "").trim().toLowerCase(); + switch (normalized) { + case "mod": + return "Mod"; + case "cmd": + case "command": + case "meta": + return "Meta"; + case "ctrl": + case "control": + return "Ctrl"; + case "alt": + case "option": + return "Alt"; + case "shift": + return "Shift"; + default: + return ""; + } +} + +function normalizeHotkeyPrimaryKey(value) { + const normalized = String(value || "").trim(); + if (!normalized) { + return ""; + } + + const lowercase = normalized.toLowerCase(); + if (lowercase === "space" || lowercase === "spacebar" || normalized === " ") { + return "Space"; + } + if (lowercase === "esc" || lowercase === "escape") { + return "Escape"; + } + if (lowercase === "enter" || lowercase === "return") { + return "Enter"; + } + if (lowercase === "tab") { + return "Tab"; + } + if (lowercase === "backspace") { + return "Backspace"; + } + if (lowercase === "delete" || lowercase === "del") { + return "Delete"; + } + if (lowercase === "up" || lowercase === "arrowup") { + return "ArrowUp"; + } + if (lowercase === "down" || lowercase === "arrowdown") { + return "ArrowDown"; + } + if (lowercase === "left" || lowercase === "arrowleft") { + return "ArrowLeft"; + } + if (lowercase === "right" || lowercase === "arrowright") { + return "ArrowRight"; + } + if (/^f\d{1,2}$/i.test(normalized)) { + return normalized.toUpperCase(); + } + if (normalized.length === 1) { + return /[a-z]/i.test(normalized) ? normalized.toUpperCase() : normalized; + } + return normalized.charAt(0).toUpperCase() + normalized.slice(1); +} + +function composeHotkeyString({ + useMod = false, + useCtrl = false, + useMeta = false, + useAlt = false, + useShift = false, + key = "", +} = {}) { + const normalizedKey = normalizeHotkeyPrimaryKey(key); + if (!normalizedKey) { + return ""; + } + + const parts = []; + if (useMod) { + parts.push("Mod"); + } else { + if (useCtrl) { + parts.push("Ctrl"); + } + if (useMeta) { + parts.push("Meta"); + } + } + if (useAlt) { + parts.push("Alt"); + } + if (useShift) { + parts.push("Shift"); + } + parts.push(normalizedKey); + return parts.join("+"); +} + +function normalizeStopHotkeySetting(value) { + const rawValue = String(value || "").trim(); + if (!rawValue) { + return ""; + } + + const tokens = rawValue + .split("+") + .map((token) => token.trim()) + .filter(Boolean); + if (tokens.length === 0) { + return ""; + } + + const key = normalizeHotkeyPrimaryKey(tokens[tokens.length - 1]); + if (!key || normalizeHotkeyModifierToken(key)) { + return ""; + } + + let useMod = false; + let useCtrl = false; + let useMeta = false; + let useAlt = false; + let useShift = false; + + for (const token of tokens.slice(0, -1)) { + const modifier = normalizeHotkeyModifierToken(token); + if (!modifier) { + return ""; + } + if (modifier === "Mod") { + useMod = true; + useCtrl = false; + useMeta = false; + continue; + } + if (useMod && (modifier === "Ctrl" || modifier === "Meta")) { + continue; + } + if (modifier === "Ctrl") { + useCtrl = true; + } else if (modifier === "Meta") { + useMeta = true; + } else if (modifier === "Alt") { + useAlt = true; + } else if (modifier === "Shift") { + useShift = true; + } + } + + return composeHotkeyString({ + useMod, + useCtrl, + useMeta, + useAlt, + useShift, + key, + }); +} + +function formatHotkeyForDisplay(value) { + const normalized = normalizeStopHotkeySetting(value); + if (!normalized) { + return ""; + } + + const isMac = process.platform === "darwin"; + return normalized + .split("+") + .map((part) => { + if (part === "Mod") { + return isMac ? "Cmd" : "Ctrl"; + } + if (part === "Meta") { + return "Cmd"; + } + if (part === "Alt") { + return isMac ? "Option" : "Alt"; + } + return part; + }) + .join("+"); +} + +function normalizeHotkeyFromEvent(event) { + const key = normalizeHotkeyPrimaryKey(event?.key); + if (!key || normalizeHotkeyModifierToken(key)) { + return ""; + } + + const isMac = process.platform === "darwin"; + return composeHotkeyString({ + useMod: isMac ? event.metaKey : event.ctrlKey, + useCtrl: isMac ? event.ctrlKey : false, + useMeta: !isMac && event.metaKey, + useAlt: event.altKey, + useShift: event.shiftKey, + key, + }); +} + +function hotkeyMatchesKeyboardEvent(configuredHotkey, event) { + const normalizedConfiguredHotkey = normalizeStopHotkeySetting(configuredHotkey); + if (!normalizedConfiguredHotkey) { + return false; + } + return normalizedConfiguredHotkey === normalizeHotkeyFromEvent(event); +} + +function isHotkeyCaptureTarget(target) { + return Boolean( + target + && target.classList + && target.classList.contains(HOTKEY_CAPTURE_INPUT_CLASS) + ); +} + +function isPathInsideDirectory(candidatePath, directoryPath) { + const normalizedCandidatePath = String(candidatePath || "").trim(); + const normalizedDirectoryPath = String(directoryPath || "").trim(); + if (!normalizedCandidatePath || !normalizedDirectoryPath) { + return false; + } + + const relativePath = path.relative(normalizedDirectoryPath, normalizedCandidatePath); + return relativePath === "" + || (!relativePath.startsWith("..") && !path.isAbsolute(relativePath)); +} + +function resolveMarkdownFilePromptPath(file, cwd = "") { + const absolutePath = String(file?.absolutePath || "").trim(); + const normalizedCwd = String(cwd || "").trim(); + const relativeFilePath = normalizePromptPath(file?.path || ""); + if (absolutePath) { + return { + promptPath: normalizePromptPath(absolutePath), + isDirectPath: true, + }; + } + + if (normalizedCwd && relativeFilePath) { + const candidateAbsolutePath = path.resolve(normalizedCwd, relativeFilePath); + if (fs.existsSync(candidateAbsolutePath)) { + return { + promptPath: normalizePromptPath(candidateAbsolutePath), + isDirectPath: true, + }; + } + } + + return { + promptPath: relativeFilePath, + isDirectPath: false, + }; +} + +function getMarkdownFilePromptPath(file, options = {}) { + const { promptPath, isDirectPath } = resolveMarkdownFilePromptPath(file, options.cwd); + if (promptPath && isDirectPath) { + return promptPath; + } + + return promptPath || String(file?.path || file?.absolutePath || "").trim(); +} + +function isSkillMarkdownFile(file, options = {}) { + const promptPath = getMarkdownFilePromptPath(file, options); + const normalizedPath = promptPath.replace(/\\/g, "/"); + const name = String(file?.name || "").trim(); + return /(^|\/)SKILL\.md$/i.test(normalizedPath) + || /(^|\/)Codex Skills\//i.test(normalizedPath) + || /(^|\/)\.codex\/skills\//i.test(normalizedPath) + || /(^|\/)\.agents\/skills\//i.test(normalizedPath) + || /^SKILL\.md$/i.test(name); +} + +function buildMarkdownFilePromptBlock(file, index, options = {}) { + const { promptPath, isDirectPath } = resolveMarkdownFilePromptPath(file, options.cwd); + if (promptPath && isDirectPath) { + return `- ${promptPath}`; + } + + const filePath = promptPath || String(file?.path || file?.absolutePath || "").trim(); + const fileContent = String(file?.content || ""); + if (filePath && fileContent) { + return `- ${filePath}\n\n\`\`\`md\n${fileContent}\n\`\`\``; + } + + return filePath ? `- ${filePath}` : `- Markdown file ${index + 1}`; +} + +function shouldAppendUserRequest(textBlocks, markdownFiles, imageFiles, trimmedMessage, includeContext = true) { + if (!trimmedMessage) { + return false; + } + + if (!includeContext) { + return true; + } + + if (textBlocks.length !== 1) { + return true; + } + + return String(textBlocks[0]?.text || "").trim() !== trimmedMessage; +} + +function buildMarkdownFilePromptSections(markdownFiles, options = {}) { + const contextFiles = []; + const skillFiles = []; + + markdownFiles.forEach((file) => { + if (isSkillMarkdownFile(file, options)) { + skillFiles.push(file); + } else { + contextFiles.push(file); + } + }); + + const sections = []; + if (contextFiles.length > 0) { + sections.push(`Context:\n${contextFiles.map((file, index) => buildMarkdownFilePromptBlock(file, index, options)).join("\n")}`); + } + if (skillFiles.length > 0) { + sections.push(`Skills:\n${skillFiles.map((file, index) => buildMarkdownFilePromptBlock(file, index, options)).join("\n")}`); + } + + return sections; +} + +function buildCanvasSelectionPrompt(selection, userMessage, options = {}) { + const textBlocks = Array.isArray(selection?.textBlocks) + ? selection.textBlocks.filter((block) => String(block?.text || "").trim()) + : []; + const markdownFiles = Array.isArray(selection?.markdownFiles) + ? selection.markdownFiles.filter((file) => String(file?.path || "").trim()) + : []; + const imageFiles = Array.isArray(selection?.imageFiles) + ? selection.imageFiles.filter((file) => String(file?.path || "").trim()) + : []; + const warnings = Array.isArray(selection?.warnings) + ? selection.warnings.map((warning) => String(warning || "").trim()).filter(Boolean) + : []; + const trimmedMessage = String(userMessage || "").trim(); + const parts = []; + + if (textBlocks.length > 0) { + parts.push( + textBlocks + .map((block) => String(block.text || "")) + .join("\n\n") + ); + } + + if (markdownFiles.length > 0) { + parts.push(...buildMarkdownFilePromptSections(markdownFiles, options)); + } + + if (imageFiles.length > 0) { + parts.push("Selected image files are attached to this turn as image inputs. Use them as part of the Canvas context."); + parts.push( + imageFiles + .map((file, index) => `Image file ${index + 1}: ${String(file.path || file.name || "Untitled")}`) + .join("\n\n") + ); + } + + if (warnings.length > 0) { + parts.push(`Resolver warnings:\n- ${warnings.join("\n- ")}`); + } + + if (shouldAppendUserRequest(textBlocks, markdownFiles, imageFiles, trimmedMessage, true)) { + parts.push(trimmedMessage); + } + + return parts.join("\n\n").trim(); +} + +function basenameVaultPath(value) { + const normalized = String(value || "").replace(/^\/+|\/+$/g, ""); + if (!normalized) { + return ""; + } + const index = normalized.lastIndexOf("/"); + return index >= 0 ? normalized.slice(index + 1) : normalized; +} + +function normalizeDaemonSandboxMode(value) { + return value === DAEMON_SANDBOX_MODE_OPTIONS.DANGER_FULL_ACCESS + ? DAEMON_SANDBOX_MODE_OPTIONS.DANGER_FULL_ACCESS + : DAEMON_SANDBOX_MODE_OPTIONS.WORKSPACE_WRITE; +} + +function getDaemonSandboxModeLabel(value) { + return normalizeDaemonSandboxMode(value) === DAEMON_SANDBOX_MODE_OPTIONS.DANGER_FULL_ACCESS + ? "Full access" + : "Workspace only"; +} + +function getDaemonSandboxModeHelpText(value) { + return normalizeDaemonSandboxMode(value) === DAEMON_SANDBOX_MODE_OPTIONS.DANGER_FULL_ACCESS + ? "Full access removes the filesystem sandbox and can reach files outside the selected project folder. Use it only for repos and prompts you trust." + : "Workspace-only keeps Codex limited to the selected project folder and is the safer default for normal work."; +} + +function normalizeRepoPath(value) { + const trimmed = String(value || "").trim(); + if (!trimmed || !path.isAbsolute(trimmed)) { + return ""; + } + + return path.normalize(trimmed); +} + +function compactPathLabel(value) { + const normalized = String(value || "").trim(); + if (!normalized) { + return ""; + } + + return path.basename(normalized) || normalized; +} + +function inferWorkspaceNameFromRepoPath(repoPath) { + const normalized = normalizeRepoPath(repoPath); + return normalized ? path.basename(normalized) : ""; +} + +function stableShortHash(value) { + return crypto.createHash("sha256").update(String(value || ""), "utf8").digest("hex").slice(0, 16); +} + +function createCanvasObjectId(prefix = "oa-canvas") { + const normalizedPrefix = String(prefix || "oa-canvas").trim() || "oa-canvas"; + if (typeof crypto.randomUUID === "function") { + return `${normalizedPrefix}-${crypto.randomUUID()}`; + } + + return `${normalizedPrefix}-${stableShortHash(`${Date.now()}\0${Math.random().toString(16)}`)}`; +} + +function createVaultId() { + return createCanvasObjectId("oa-vault"); +} + +function buildTaskResultNodeId(taskId, sourceNodeId) { + return `oa-result-${stableShortHash(`${String(taskId || "").trim()}\0${String(sourceNodeId || "").trim()}`)}`; +} + +function getOpenAgentCanvasMetadata(value) { + const metadata = value?.openagent; + return metadata && typeof metadata === "object" && !Array.isArray(metadata) ? metadata : null; +} + +function isOpenAgentAssistantResultNode(node) { + const metadata = getOpenAgentCanvasMetadata(node); + return metadata?.kind === "assistant-result" || String(node?.id || "").startsWith("oa-result-"); +} + +function getOpenAgentResultSourceNodeId(node) { + const metadata = getOpenAgentCanvasMetadata(node); + return metadata?.kind === "assistant-result" ? String(metadata.sourceNodeId || "").trim() : ""; +} + +function getOpenAgentResultTaskId(node) { + const metadata = getOpenAgentCanvasMetadata(node); + return metadata?.kind === "assistant-result" ? String(metadata.taskId || "").trim() : ""; +} + +function normalizeResultNodeSyncState(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return {}; + } + + return Object.fromEntries( + Object.entries(value) + .map(([taskId, signature]) => [String(taskId || "").trim(), String(signature || "").trim()]) + .filter(([taskId, signature]) => taskId && signature) + ); +} + +function normalizeCanvasRunSourceRefState(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return {}; + } + + return Object.fromEntries( + Object.entries(value) + .map(([taskId, ref]) => { + const normalizedTaskId = String(taskId || "").trim(); + const canvasPath = String(ref?.canvasPath || "").trim(); + const nodeId = String(ref?.nodeId || "").trim(); + return [normalizedTaskId, { canvasPath, nodeId }]; + }) + .filter(([taskId, ref]) => taskId && ref.canvasPath && ref.nodeId) + ); +} + +function normalizeUnreadTaskState(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) { + return {}; + } + + return Object.fromEntries( + Object.entries(value) + .map(([taskId, unread]) => [String(taskId || "").trim(), unread === true]) + .filter(([taskId, unread]) => taskId && unread) + ); +} + +function clampNumber(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +function toFiniteNumber(value, fallback = 0) { + const numeric = Number(value); + return Number.isFinite(numeric) ? numeric : fallback; +} + +function estimateCanvasTextNodeHeight(text, width = RESULT_NODE_DEFAULT_WIDTH) { + const normalizedText = String(text || "").replace(/\r\n/g, "\n"); + if (!normalizedText.trim()) { + return RESULT_NODE_MIN_HEIGHT; + } + + const charsPerLine = clampNumber( + Math.round(toFiniteNumber(width, RESULT_NODE_DEFAULT_WIDTH) / 8), + 24, + RESULT_NODE_CHARS_PER_LINE + ); + const visualLines = normalizedText + .split("\n") + .reduce((count, line) => count + Math.max(1, Math.ceil(Math.max(1, line.length) / charsPerLine)), 0); + + return clampNumber(88 + (visualLines * 22), RESULT_NODE_MIN_HEIGHT, RESULT_NODE_MAX_HEIGHT); +} + +function getCanvasTextNodeAutoFitHeight(node) { + if (String(node?.type || "").trim() !== "text") { + return null; + } + + const width = clampNumber( + toFiniteNumber(node?.width, RESULT_NODE_DEFAULT_WIDTH), + RESULT_NODE_MIN_WIDTH, + RESULT_NODE_MAX_WIDTH + ); + const estimatedHeight = estimateCanvasTextNodeHeight(node?.text, width); + const existingHeight = toFiniteNumber(node?.height, 0); + return Math.max(estimatedHeight, existingHeight); +} + +function compareCanvasNodeOrder(a, b) { + const yDifference = toFiniteNumber(a?.y, 0) - toFiniteNumber(b?.y, 0); + if (yDifference !== 0) { + return yDifference; + } + + const xDifference = toFiniteNumber(a?.x, 0) - toFiniteNumber(b?.x, 0); + if (xDifference !== 0) { + return xDifference; + } + + return String(a?.id || "").localeCompare(String(b?.id || "")); +} + +function averageNumbers(values) { + return values.length > 0 + ? values.reduce((sum, value) => sum + value, 0) / values.length + : null; +} + +function getCanvasLayoutNodeWidth(node) { + const fallbackWidth = String(node?.type || "").trim() === "text" ? RESULT_NODE_DEFAULT_WIDTH : 360; + return Math.max(CANVAS_LAYOUT_MIN_WIDTH, toFiniteNumber(node?.width, fallbackWidth)); +} + +function getCanvasLayoutNodeHeight(node, width) { + const existingHeight = toFiniteNumber(node?.height, 0); + if (existingHeight > 0) { + return Math.max(CANVAS_LAYOUT_MIN_HEIGHT, existingHeight); + } + + if (String(node?.type || "").trim() === "text") { + return Math.max(CANVAS_LAYOUT_MIN_HEIGHT, estimateCanvasTextNodeHeight(node?.text, width)); + } + + return 220; +} + +function getCanvasNodeCenter(node) { + if (!node || typeof node !== "object") { + return null; + } + + const width = Math.max(0, toFiniteNumber(node.width, 0)); + const height = Math.max(0, toFiniteNumber(node.height, 0)); + return { + x: toFiniteNumber(node.x, 0) + (width / 2), + y: toFiniteNumber(node.y, 0) + (height / 2), + }; +} + +function doesCanvasGroupContainNode(groupNode, candidateNode) { + if (String(groupNode?.type || "").trim() !== "group") { + return false; + } + + const center = getCanvasNodeCenter(candidateNode); + if (!center) { + return false; + } + + const groupX = toFiniteNumber(groupNode.x, 0); + const groupY = toFiniteNumber(groupNode.y, 0); + const groupWidth = Math.max(0, toFiniteNumber(groupNode.width, 0)); + const groupHeight = Math.max(0, toFiniteNumber(groupNode.height, 0)); + return ( + center.x >= groupX + && center.x <= groupX + groupWidth + && center.y >= groupY + && center.y <= groupY + groupHeight + ); +} + +function escapeAttributeSelectorValue(value) { + return String(value || "") + .replace(/\\/g, "\\\\") + .replace(/"/g, '\\"'); +} + +function parseIsoTimestamp(value) { + const normalizedValue = String(value || "").trim(); + if (!normalizedValue) { + return null; + } + + const timestamp = Date.parse(normalizedValue); + return Number.isFinite(timestamp) ? timestamp : null; +} + +function getStartOfLocalDayTimestamp(value) { + const timestamp = Number(value); + if (!Number.isFinite(timestamp)) { + return null; + } + + const date = new Date(timestamp); + date.setHours(0, 0, 0, 0); + return date.getTime(); +} + +function formatTaskListDayLabel(dayTimestamp) { + const normalizedDayTimestamp = Number(dayTimestamp); + if (!Number.isFinite(normalizedDayTimestamp)) { + return "Unknown"; + } + + const dayDate = new Date(normalizedDayTimestamp); + const today = new Date(); + today.setHours(0, 0, 0, 0); + const dayDifference = Math.round((today.getTime() - normalizedDayTimestamp) / 86_400_000); + if (dayDifference === 0) { + return "Today"; + } + if (dayDifference === 1) { + return "Yesterday"; + } + + return dayDate.toLocaleDateString([], { + weekday: "short", + month: "short", + day: "numeric", + year: dayDate.getFullYear() === today.getFullYear() ? undefined : "numeric", + }); +} + +function formatTaskListTimeLabel(timestamp) { + const normalizedTimestamp = Number(timestamp); + if (!Number.isFinite(normalizedTimestamp) || normalizedTimestamp <= 0) { + return ""; + } + + try { + return new Date(normalizedTimestamp).toLocaleTimeString([], { + hour: "numeric", + minute: "2-digit", + }); + } catch { + return ""; + } +} + +function autoArrangeCanvasNodes(nodes, edges) { + const originalNodes = Array.isArray(nodes) + ? nodes + : []; + const normalizedNodes = originalNodes.filter((node) => String(node?.id || "").trim()); + const groupNodes = normalizedNodes.filter((node) => String(node?.type || "").trim() === "group"); + const layoutNodes = normalizedNodes.filter((node) => { + if (String(node?.type || "").trim() === "group") { + return false; + } + + // Leave group contents untouched so auto-arrange only reflows top-level nodes. + return !groupNodes.some((groupNode) => doesCanvasGroupContainNode(groupNode, node)); + }); + if (layoutNodes.length <= 1) { + return originalNodes; + } + + const normalizedEdges = Array.isArray(edges) ? edges : []; + const nodeById = new Map( + layoutNodes.map((node) => [String(node.id || "").trim(), node]) + ); + const outgoingNodeIdsByNodeId = new Map(); + const incomingNodeIdsByNodeId = new Map(); + const neighborNodeIdsByNodeId = new Map(); + + nodeById.forEach((_node, nodeId) => { + outgoingNodeIdsByNodeId.set(nodeId, []); + incomingNodeIdsByNodeId.set(nodeId, []); + neighborNodeIdsByNodeId.set(nodeId, []); + }); + + normalizedEdges.forEach((edge) => { + const fromNodeId = String(edge?.fromNode || "").trim(); + const toNodeId = String(edge?.toNode || "").trim(); + if (!fromNodeId || !toNodeId || fromNodeId === toNodeId) { + return; + } + if (!nodeById.has(fromNodeId) || !nodeById.has(toNodeId)) { + return; + } + + outgoingNodeIdsByNodeId.get(fromNodeId).push(toNodeId); + incomingNodeIdsByNodeId.get(toNodeId).push(fromNodeId); + neighborNodeIdsByNodeId.get(fromNodeId).push(toNodeId); + neighborNodeIdsByNodeId.get(toNodeId).push(fromNodeId); + }); + + const sortNodeIds = (nodeIds) => { + return [...new Set(nodeIds)].sort((leftNodeId, rightNodeId) => { + return compareCanvasNodeOrder(nodeById.get(leftNodeId), nodeById.get(rightNodeId)); + }); + }; + + const orderedNodeIds = sortNodeIds([...nodeById.keys()]); + const unvisitedNodeIds = new Set(orderedNodeIds); + const connectedComponents = []; + + while (unvisitedNodeIds.size > 0) { + const startNodeId = orderedNodeIds.find((nodeId) => unvisitedNodeIds.has(nodeId)); + if (!startNodeId) { + break; + } + + const componentNodeIds = []; + const queue = [startNodeId]; + unvisitedNodeIds.delete(startNodeId); + + while (queue.length > 0) { + const currentNodeId = queue.shift(); + componentNodeIds.push(currentNodeId); + + sortNodeIds(neighborNodeIdsByNodeId.get(currentNodeId) || []).forEach((neighborNodeId) => { + if (!unvisitedNodeIds.has(neighborNodeId)) { + return; + } + + unvisitedNodeIds.delete(neighborNodeId); + queue.push(neighborNodeId); + }); + } + + connectedComponents.push(sortNodeIds(componentNodeIds)); + } + + const isolatedNodeIds = []; + const layoutComponents = connectedComponents.filter((componentNodeIds) => { + if (componentNodeIds.length !== 1) { + return true; + } + + const nodeId = componentNodeIds[0]; + if ((neighborNodeIdsByNodeId.get(nodeId) || []).length > 0) { + return true; + } + + isolatedNodeIds.push(nodeId); + return false; + }); + if (isolatedNodeIds.length > 0) { + layoutComponents.push(sortNodeIds(isolatedNodeIds)); + } + + const nextPositionByNodeId = new Map(); + let componentOffsetX = CANVAS_LAYOUT_BASE_X; + + [...layoutComponents].reverse().forEach((componentNodeIds) => { + const componentNodeIdSet = new Set(componentNodeIds); + const localIncomingCountByNodeId = new Map(); + const depthByNodeId = new Map(); + const pendingNodeIds = []; + const consumedNodeIds = new Set(); + + componentNodeIds.forEach((nodeId) => { + const incomingNodeIds = (incomingNodeIdsByNodeId.get(nodeId) || []).filter((incomingNodeId) => { + return componentNodeIdSet.has(incomingNodeId); + }); + localIncomingCountByNodeId.set(nodeId, incomingNodeIds.length); + if (incomingNodeIds.length === 0) { + depthByNodeId.set(nodeId, 0); + pendingNodeIds.push(nodeId); + } + }); + + while (pendingNodeIds.length > 0) { + pendingNodeIds.sort((leftNodeId, rightNodeId) => { + return compareCanvasNodeOrder(nodeById.get(leftNodeId), nodeById.get(rightNodeId)); + }); + const currentNodeId = pendingNodeIds.shift(); + if (consumedNodeIds.has(currentNodeId)) { + continue; + } + + consumedNodeIds.add(currentNodeId); + const nextDepth = (depthByNodeId.get(currentNodeId) || 0) + 1; + + sortNodeIds((outgoingNodeIdsByNodeId.get(currentNodeId) || []).filter((nextNodeId) => { + return componentNodeIdSet.has(nextNodeId); + })).forEach((nextNodeId) => { + depthByNodeId.set(nextNodeId, Math.max(depthByNodeId.get(nextNodeId) || 0, nextDepth)); + localIncomingCountByNodeId.set(nextNodeId, Math.max(0, (localIncomingCountByNodeId.get(nextNodeId) || 0) - 1)); + if ((localIncomingCountByNodeId.get(nextNodeId) || 0) === 0) { + pendingNodeIds.push(nextNodeId); + } + }); + } + + let maxDepth = depthByNodeId.size > 0 + ? Math.max(...depthByNodeId.values()) + : 0; + + sortNodeIds(componentNodeIds.filter((nodeId) => !depthByNodeId.has(nodeId))).forEach((nodeId) => { + const incomingDepths = (incomingNodeIdsByNodeId.get(nodeId) || []) + .filter((incomingNodeId) => componentNodeIdSet.has(incomingNodeId) && depthByNodeId.has(incomingNodeId)) + .map((incomingNodeId) => depthByNodeId.get(incomingNodeId)); + const suggestedDepth = incomingDepths.length > 0 ? Math.max(...incomingDepths) + 1 : maxDepth + 1; + depthByNodeId.set(nodeId, suggestedDepth); + maxDepth = Math.max(maxDepth, suggestedDepth); + }); + + const rowDepths = [...new Set(componentNodeIds.map((nodeId) => depthByNodeId.get(nodeId) || 0))].sort((leftDepth, rightDepth) => { + return leftDepth - rightDepth; + }); + const rowHeightByDepth = new Map(); + rowDepths.forEach((depth) => { + const rowHeight = componentNodeIds + .filter((nodeId) => (depthByNodeId.get(nodeId) || 0) === depth) + .reduce((maxHeight, nodeId) => { + const width = getCanvasLayoutNodeWidth(nodeById.get(nodeId)); + return Math.max(maxHeight, getCanvasLayoutNodeHeight(nodeById.get(nodeId), width)); + }, CANVAS_LAYOUT_MIN_HEIGHT); + rowHeightByDepth.set(depth, rowHeight); + }); + + const placedCenterXByNodeId = new Map(); + let componentWidth = 0; + let rowOffsetY = CANVAS_LAYOUT_BASE_Y; + + rowDepths.forEach((depth, rowIndex) => { + if (rowIndex > 0) { + const previousDepth = rowDepths[rowIndex - 1]; + rowOffsetY += (rowHeightByDepth.get(previousDepth) || CANVAS_LAYOUT_MIN_HEIGHT) + CANVAS_LAYOUT_Y_GAP; + } + + const rowNodeIds = componentNodeIds + .filter((nodeId) => (depthByNodeId.get(nodeId) || 0) === depth) + .sort((leftNodeId, rightNodeId) => { + const leftAverageIncomingCenter = averageNumbers( + (incomingNodeIdsByNodeId.get(leftNodeId) || []) + .map((incomingNodeId) => placedCenterXByNodeId.get(incomingNodeId)) + .filter((value) => Number.isFinite(value)) + ); + const rightAverageIncomingCenter = averageNumbers( + (incomingNodeIdsByNodeId.get(rightNodeId) || []) + .map((incomingNodeId) => placedCenterXByNodeId.get(incomingNodeId)) + .filter((value) => Number.isFinite(value)) + ); + if (leftAverageIncomingCenter !== null && rightAverageIncomingCenter !== null && leftAverageIncomingCenter !== rightAverageIncomingCenter) { + return leftAverageIncomingCenter - rightAverageIncomingCenter; + } + if (leftAverageIncomingCenter !== null || rightAverageIncomingCenter !== null) { + return leftAverageIncomingCenter === null ? 1 : -1; + } + + return compareCanvasNodeOrder(nodeById.get(leftNodeId), nodeById.get(rightNodeId)); + }); + + let rowOffsetX = 0; + rowNodeIds.forEach((nodeId) => { + const node = nodeById.get(nodeId); + const width = getCanvasLayoutNodeWidth(node); + const height = getCanvasLayoutNodeHeight(node, width); + nextPositionByNodeId.set(nodeId, { + x: componentOffsetX + rowOffsetX, + y: rowOffsetY, + }); + placedCenterXByNodeId.set(nodeId, rowOffsetX + (width / 2)); + rowOffsetX += width + CANVAS_LAYOUT_X_GAP; + }); + + componentWidth = Math.max(componentWidth, Math.max(0, rowOffsetX - CANVAS_LAYOUT_X_GAP)); + }); + + componentOffsetX += componentWidth + CANVAS_LAYOUT_COMPONENT_GAP; + }); + + return originalNodes.map((node) => { + const nodeId = String(node?.id || "").trim(); + const nextPosition = nextPositionByNodeId.get(nodeId); + if (!nextPosition) { + return node; + } + + return { + ...node, + x: nextPosition.x, + y: nextPosition.y, + }; + }); +} + +class WorkspacePickerModal extends Modal { + constructor(app, plugin, options = {}) { + super(app); + this.plugin = plugin; + this.options = options; + this.repoPathInput = null; + this.workspaceNameInput = null; + } + + onOpen() { + const loadPromise = this.plugin.ensureWorkspaceSummariesLoaded(); + this.render(); + void loadPromise.finally(() => { + if (this.contentEl?.isConnected) { + this.render(); + } + }); + } + + render() { + const { contentEl } = this; + contentEl.empty(); + contentEl.addClass("oa-workspace-modal"); + contentEl.createEl("h2", { text: "Choose workspace" }); + contentEl.createDiv({ + cls: "oa-workspace-modal-subtitle", + text: "Open an existing repo workspace or create a new Canvas home for a project.", + }); + + const existing = this.plugin.listWorkspaceSummaries(); + const isLoadingWorkspaces = this.plugin.isWorkspaceSummariesLoading(); + const existingSection = contentEl.createDiv({ cls: "oa-workspace-section" }); + existingSection.createEl("h3", { text: "Existing workspaces" }); + + if (existing.length === 0 && isLoadingWorkspaces) { + existingSection.createDiv({ + cls: "oa-muted", + text: "Loading workspaces...", + }); + } else if (existing.length === 0) { + existingSection.createDiv({ + cls: "oa-muted", + text: "No workspace yet. Create one from a repo path below.", + }); + } else { + const list = existingSection.createDiv({ cls: "oa-workspace-list" }); + existing.forEach((workspace) => { + const item = list.createDiv({ cls: "oa-workspace-item" }); + const itemMain = item.createDiv({ cls: "oa-workspace-item-main" }); + itemMain.createDiv({ cls: "oa-task-title", text: workspace.name }); + itemMain.createDiv({ cls: "oa-task-meta", text: workspace.repoPath }); + const buttonRow = item.createDiv({ cls: "oa-action-row" }); + const openButton = new ButtonComponent(buttonRow); + openButton.setButtonText("Open"); + openButton.buttonEl?.addClass("oa-workspace-open-button"); + openButton.onClick(async () => { + await this.plugin.openWorkspace(workspace); + this.close(); + }); + }); + } + + const createSection = contentEl.createDiv({ cls: "oa-workspace-section oa-workspace-create-panel" }); + createSection.createEl("h3", { text: "Create workspace" }); + + new Setting(createSection) + .setName("Repo path") + .setDesc("Absolute filesystem path to the repo folder that Codex should use for this workspace.") + .addText((text) => { + this.repoPathInput = text; + text + .setPlaceholder("/absolute/path/to/repo") + .setValue(""); + }) + .addButton((button) => { + button.setButtonText("Browse..."); + button.onClick(async () => { + try { + const defaultPath = this.repoPathInput?.getValue?.() || ""; + const selectedPath = await this.plugin.pickDirectoryPath({ + defaultPath, + title: "Choose repo folder", + }); + if (!selectedPath) { + return; + } + + this.repoPathInput?.setValue(selectedPath); + if (this.workspaceNameInput && !String(this.workspaceNameInput.getValue?.() || "").trim()) { + this.workspaceNameInput.setValue(inferWorkspaceNameFromRepoPath(selectedPath)); + } + } catch (error) { + new Notice(String(error?.message || error)); + } + }); + }); + + new Setting(createSection) + .setName("Workspace name") + .setDesc("Optional. Leave blank to use the repo folder name.") + .addText((text) => { + this.workspaceNameInput = text; + text + .setPlaceholder("openagent") + .setValue(""); + }); + + const actions = createSection.createDiv({ cls: "oa-action-row" }); + const createButton = new ButtonComponent(actions); + createButton.setButtonText("Create"); + createButton.setCta(); + createButton.onClick(async () => { + try { + const repoPath = this.repoPathInput?.getValue?.() || ""; + const workspaceName = this.workspaceNameInput?.getValue?.() || ""; + await this.plugin.createWorkspaceFromRepoPath(repoPath, workspaceName); + this.close(); + } catch (error) { + new Notice(String(error?.message || error)); + } + }); + } + + onClose() { + this.contentEl.empty(); + } +} + +class CanvasForkConfirmModal extends Modal { + constructor(app, options = {}) { + super(app); + this.options = options; + this.resolve = typeof options.resolve === "function" ? options.resolve : () => {}; + this.didChoose = false; + } + + onOpen() { + const { contentEl } = this; + contentEl.empty(); + contentEl.addClass("oa-fork-modal"); + contentEl.createEl("h2", { text: "Fork from here?" }); + contentEl.createDiv({ + cls: "oa-fork-modal-subtitle", + text: "This branch starts a separate OpenAgent thread from the selected Canvas point.", + }); + + const details = contentEl.createDiv({ cls: "oa-fork-modal-details" }); + const originLabel = String(this.options.originLabel || "").trim(); + const rollbackTurns = Math.max(0, Math.floor(Number(this.options.rollbackTurns || 0))); + if (originLabel) { + details.createDiv({ text: `Origin: ${originLabel}` }); + } + if (rollbackTurns > 0) { + details.createDiv({ text: `Codex will fork the thread and drop ${rollbackTurns} later turn${rollbackTurns === 1 ? "" : "s"} before running this node.` }); + } + + const actions = contentEl.createDiv({ cls: "oa-action-row oa-fork-modal-actions" }); + const forkButton = new ButtonComponent(actions); + forkButton.setButtonText("Fork and run"); + forkButton.setCta(); + forkButton.onClick(() => this.choose("fork")); + + const continueButton = new ButtonComponent(actions); + continueButton.setButtonText("Continue thread"); + continueButton.onClick(() => this.choose("continue")); + + const cancelButton = new ButtonComponent(actions); + cancelButton.setButtonText("Cancel"); + cancelButton.onClick(() => this.choose("cancel")); + } + + choose(value) { + this.didChoose = true; + this.resolve(value); + this.close(); + } + + onClose() { + this.contentEl.empty(); + if (!this.didChoose) { + this.resolve("cancel"); + } + } +} + +class OpenAgentDaemonLauncher { + constructor(plugin) { + this.plugin = plugin; + this.startPromise = null; + } + + async ensureStarted() { + if (this.startPromise) { + return this.startPromise; + } + + this.startPromise = this.startInternal(); + try { + return await this.startPromise; + } finally { + this.startPromise = null; + } + } + + async startInternal() { + const launchSpec = this.resolveLaunchSpec(); + if (!launchSpec?.command) { + throw new Error( + "Codex server is not running, and auto-launch could not find this repo. Set a server launch command in OpenAgent settings." + ); + } + + fs.mkdirSync(path.dirname(DAEMON_LOG_PATH), { recursive: true }); + + const shellCommand = `${launchSpec.command} >> ${shellEscape(DAEMON_LOG_PATH)} 2>&1`; + const child = spawn("/bin/zsh", ["-lc", shellCommand], { + cwd: launchSpec.cwd || os.homedir(), + detached: true, + stdio: "ignore", + }); + child.unref(); + + await this.waitForReady(); + } + + resolveLaunchSpec() { + const configuredCommand = String(this.plugin.settings?.daemonLaunchCommand || "").trim(); + const configuredCwd = this.normalizeDirectory(this.plugin.settings?.daemonLaunchCwd); + if (configuredCommand) { + return { + cwd: configuredCwd || os.homedir(), + command: configuredCommand, + }; + } + + const repoRoot = this.findRepoRoot(); + if (!repoRoot) { + return null; + } + + return { + cwd: repoRoot, + command: `cd ${shellEscape(repoRoot)} && exec pnpm dev:daemon`, + }; + } + + findRepoRoot() { + const candidates = [ + this.findRepoNearPlugin(), + path.join(os.homedir(), "Documents", "GitHub", "openagent"), + path.join(os.homedir(), "GitHub", "openagent"), + path.join(os.homedir(), "Documents", "openagent"), + path.join(os.homedir(), "openagent"), + ].filter(Boolean); + + for (const candidate of candidates) { + const daemonPath = path.join(candidate, "apps", "openagent-daemon", "src", "server.js"); + const packagePath = path.join(candidate, "package.json"); + if (fs.existsSync(daemonPath) && fs.existsSync(packagePath)) { + return candidate; + } + } + + return ""; + } + + findRepoNearPlugin() { + let currentPath = __dirname; + while (currentPath) { + const daemonPath = path.join(currentPath, "apps", "openagent-daemon", "src", "server.js"); + if (fs.existsSync(daemonPath)) { + return currentPath; + } + + const parentPath = path.dirname(currentPath); + if (parentPath === currentPath) { + return ""; + } + currentPath = parentPath; + } + + return ""; + } + + normalizeDirectory(value) { + const trimmed = String(value || "").trim(); + if (!trimmed || !path.isAbsolute(trimmed)) { + return ""; + } + + const normalized = path.normalize(trimmed); + if (!fs.existsSync(normalized) || !fs.statSync(normalized).isDirectory()) { + return ""; + } + + return normalized; + } + + async waitForReady() { + let lastError = null; + + for (let attempt = 0; attempt < 20; attempt += 1) { + await sleep(attempt === 0 ? 250 : 500); + + try { + await this.plugin.api.requestOnce("GET", "/health"); + return; + } catch (error) { + lastError = error; + } + } + + throw lastError || new Error("Codex server did not become ready."); + } +} + +class OpenAgentApiClient { + constructor(options = {}) { + this.config = null; + this.daemonLauncher = options.daemonLauncher || null; + } + + loadConfig() { + if (this.config) { + return this.config; + } + + if (!fs.existsSync(DAEMON_CONFIG_PATH)) { + throw new Error("Codex server config was not found. Start the server first."); + } + + const parsed = JSON.parse(fs.readFileSync(DAEMON_CONFIG_PATH, "utf8")); + if (!parsed?.host || !parsed?.port || !parsed?.token) { + throw new Error("Codex server config is invalid."); + } + + this.config = parsed; + return this.config; + } + + async request(method, route, body = null) { + try { + return await this.requestOnce(method, route, body); + } catch (error) { + if (!this.shouldTryAutoLaunch(error)) { + throw error; + } + + if (!this.daemonLauncher) { + throw error; + } + + this.config = null; + await this.daemonLauncher.ensureStarted(); + this.config = null; + return this.requestOnce(method, route, body); + } + } + + async requestOnce(method, route, body = null) { + const config = this.loadConfig(); + + return new Promise((resolve, reject) => { + const payload = body == null ? null : JSON.stringify(body); + const request = http.request({ + host: config.host, + port: config.port, + path: route, + method, + headers: { + "content-type": "application/json", + "x-openagent-token": config.token, + ...(payload ? { "content-length": Buffer.byteLength(payload) } : {}), + }, + }, (response) => { + let buffer = ""; + response.setEncoding("utf8"); + response.on("data", (chunk) => { + buffer += chunk; + }); + response.on("end", () => { + let parsed = {}; + try { + parsed = buffer.trim() ? JSON.parse(buffer) : {}; + } catch (error) { + reject(new Error(`Unable to parse Codex server response: ${error.message}`)); + return; + } + + if (response.statusCode >= 400) { + reject(new Error(parsed?.error?.message || `Codex server request failed (${response.statusCode}).`)); + return; + } + + resolve(parsed); + }); + }); + + request.on("error", (error) => { + reject(new Error(`Unable to reach the Codex server: ${error.message}`)); + }); + + if (payload) { + request.write(payload); + } + + request.end(); + }); + } + + shouldTryAutoLaunch(error) { + const message = String(error?.message || error || "").toLowerCase(); + return ( + message.includes("codex server config was not found") + || message.includes("unable to reach the codex server") + || message.includes("econnrefused") + || message.includes("connect enoent") + ); + } + + getHealth() { + return this.request("GET", "/health"); + } + + getHealthOnce(options = {}) { + if (options.reloadConfig === true) { + this.config = null; + } + return this.requestOnce("GET", "/health"); + } + + getTasks(options = {}) { + const vaultId = String(options.vaultId || "").trim(); + const query = vaultId ? `?vaultId=${encodeURIComponent(vaultId)}` : ""; + return this.request("GET", `/tasks${query}`); + } + + getAutomations() { + return this.request("GET", "/automations"); + } + + syncAutomations(body = {}) { + return this.request("PUT", "/automations/sync", body); + } + + runAutomation(automationId, body = {}) { + return this.request("POST", `/automations/${encodeURIComponent(automationId)}/run`, body); + } + + getTask(taskId) { + return this.request("GET", `/tasks/${encodeURIComponent(taskId)}`); + } + + createTaskFromCanvasSelection(selection) { + return this.request("POST", "/tasks/from-canvas-selection", selection); + } + + runTask(taskId, body = {}) { + return this.request("POST", `/tasks/${encodeURIComponent(taskId)}/run`, body); + } + + forkTask(taskId, body = {}) { + return this.request("POST", `/tasks/${encodeURIComponent(taskId)}/fork`, body); + } + + sendMessage(taskId, text, runtimeConfig = null) { + return this.request("POST", `/tasks/${encodeURIComponent(taskId)}/messages`, { + text, + ...(runtimeConfig ? { runtimeConfig } : {}), + }); + } + + updateTaskCanvasBinding(taskId, body = {}) { + return this.request("PATCH", `/tasks/${encodeURIComponent(taskId)}/canvas-binding`, body); + } + + interruptTask(taskId) { + return this.request("POST", `/tasks/${encodeURIComponent(taskId)}/interrupt`, {}); + } + + startVoiceRealtime(body = {}) { + return this.request("POST", "/voice/realtime/start", body); + } + + stopVoiceRealtime(sessionId) { + return this.request("POST", `/voice/realtime/${encodeURIComponent(sessionId)}/stop`, {}); + } + + openVoiceRealtimeStream(sessionId, handlers = {}) { + return this.openEventStream(`/voice/realtime/${encodeURIComponent(sessionId)}/stream`, handlers); + } + + openEventStream(route, handlers = {}) { + return this.openTaskLikeStream(route, handlers); + } + + openTaskStream(taskId, handlers = {}) { + return this.openTaskLikeStream(`/tasks/${encodeURIComponent(taskId)}/stream`, handlers); + } + + openTaskLikeStream(route, handlers = {}) { + const config = this.loadConfig(); + const normalizedHandlers = typeof handlers === "function" + ? { onEvent: handlers } + : (handlers && typeof handlers === "object" ? handlers : {}); + const onEvent = typeof normalizedHandlers.onEvent === "function" + ? normalizedHandlers.onEvent + : () => {}; + const onOpen = typeof normalizedHandlers.onOpen === "function" + ? normalizedHandlers.onOpen + : () => {}; + const onClose = typeof normalizedHandlers.onClose === "function" + ? normalizedHandlers.onClose + : () => {}; + const onError = typeof normalizedHandlers.onError === "function" + ? normalizedHandlers.onError + : () => {}; + const request = http.request({ + host: config.host, + port: config.port, + path: route, + method: "GET", + headers: { + Accept: "text/event-stream", + "x-openagent-token": config.token, + }, + }); + + let buffer = ""; + let responseRef = null; + let isClosed = false; + const notifyClose = (reason, detail = null) => { + if (isClosed) { + return; + } + + isClosed = true; + try { + onClose(reason, detail); + } catch { + // Ignore stream close callback failures. + } + }; + + request.on("response", (response) => { + responseRef = response; + if ((response.statusCode || 0) >= 400) { + let errorBuffer = ""; + response.setEncoding("utf8"); + response.on("data", (chunk) => { + errorBuffer += chunk; + }); + response.on("end", () => { + let message = `Task stream failed (${response.statusCode}).`; + try { + const parsed = errorBuffer.trim() ? JSON.parse(errorBuffer) : {}; + message = parsed?.error?.message || message; + } catch { + if (errorBuffer.trim()) { + message = errorBuffer.trim(); + } + } + + try { + onError(new Error(message)); + } catch { + // Ignore stream error callback failures. + } + notifyClose("http-error", { + statusCode: response.statusCode, + message, + }); + }); + response.on("close", () => { + notifyClose("close"); + }); + return; + } + + try { + onOpen(); + } catch { + // Ignore stream open callback failures. + } + + response.setEncoding("utf8"); + response.on("data", (chunk) => { + buffer += chunk; + + while (buffer.includes("\n\n")) { + const boundary = buffer.indexOf("\n\n"); + const block = buffer.slice(0, boundary); + buffer = buffer.slice(boundary + 2); + + const lines = block.split("\n"); + let event = "message"; + let data = ""; + for (const line of lines) { + if (line.startsWith("event:")) { + event = line.slice(6).trim(); + } else if (line.startsWith("data:")) { + data += line.slice(5).trim(); + } + } + + if (!data) { + continue; + } + + try { + onEvent(event, JSON.parse(data)); + } catch { + // Ignore malformed stream frames. + } + } + }); + response.on("end", () => { + notifyClose("end"); + }); + response.on("close", () => { + notifyClose("close"); + }); + response.on("error", (error) => { + try { + onError(error); + } catch { + // Ignore stream error callback failures. + } + notifyClose("response-error", { + error: String(error?.message || error), + }); + }); + }); + + request.on("error", (error) => { + try { + onError(error); + } catch { + // Ignore stream error callback failures. + } + notifyClose("request-error", { + error: String(error?.message || error), + }); + }); + request.end(); + + return () => { + isClosed = true; + if (responseRef && !responseRef.destroyed) { + responseRef.destroy(); + } + request.destroy(); + }; + } +} + +class CanvasSelectionResolver { + constructor(app, plugin = null) { + this.app = app; + this.plugin = plugin; + } + + async resolveActiveSelection() { + const view = this.getActiveCanvasView(); + if (!view) { + throw new Error("Open a Canvas view first."); + } + + const file = view.file || this.app.workspace.getActiveFile(); + if (!(file instanceof TFile) || file.extension !== "canvas") { + throw new Error("The active view is not backed by a .canvas file."); + } + + const selectedNodeIds = this.extractSelectedNodeIds(view); + if (selectedNodeIds.length === 0) { + throw new Error("Select one or more Canvas nodes first."); + } + + const liveNodeDataById = this.extractLiveSelectedNodeDataById(view, selectedNodeIds); + await this.flushPendingCanvasEdits(view); + + return this.resolveCanvasSelection(file, selectedNodeIds, { view, liveNodeDataById }); + } + + getActiveCanvasView() { + const activeLeaf = this.app.workspace.activeLeaf; + if (activeLeaf?.view?.getViewType?.() === "canvas") { + return activeLeaf.view; + } + + const canvasLeaves = this.app.workspace.getLeavesOfType("canvas"); + return canvasLeaves[0]?.view || null; + } + + isEditableCanvasElement(element) { + if (!element || typeof element !== "object") { + return false; + } + + if (typeof element.matches === "function" && element.matches("textarea, input, [contenteditable='true'], .cm-content")) { + return true; + } + + return Boolean(element.closest?.("[contenteditable='true'], .cm-content")); + } + + async requestCanvasSave(view) { + const calls = [ + [view, "requestSave"], + [view, "save"], + [view?.canvas, "requestSave"], + [view?.canvas, "save"], + ]; + + for (const [owner, method] of calls) { + if (typeof owner?.[method] !== "function") { + continue; + } + + try { + const result = owner[method](); + if (result && typeof result.then === "function") { + await result; + } + } catch { + // Canvas internals differ between Obsidian versions; best effort is enough here. + } + } + } + + async flushPendingCanvasEdits(view) { + const containerEl = view?.containerEl; + const activeElement = containerEl?.ownerDocument?.activeElement; + const isEditingCanvas = Boolean( + activeElement + && typeof containerEl?.contains === "function" + && containerEl.contains(activeElement) + && this.isEditableCanvasElement(activeElement) + ); + + if (isEditingCanvas && typeof activeElement.blur === "function") { + activeElement.blur(); + await sleep(0); + } + + await this.requestCanvasSave(view); + + if (isEditingCanvas) { + await sleep(50); + await this.requestCanvasSave(view); + } + } + + getCanvasViewForFile(fileOrPath) { + const normalizedPath = typeof fileOrPath === "string" + ? String(fileOrPath || "").trim() + : String(fileOrPath?.path || "").trim(); + if (!normalizedPath) { + return null; + } + + const activeView = this.getActiveCanvasView(); + if (String(activeView?.file?.path || "").trim() === normalizedPath) { + return activeView; + } + + const canvasLeaves = this.app.workspace.getLeavesOfType("canvas"); + for (const leaf of canvasLeaves) { + const view = leaf?.view; + if (String(view?.file?.path || "").trim() === normalizedPath) { + return view; + } + } + + return null; + } + + getCanvasRuntimeData(view) { + const canvas = view?.canvas; + if (!canvas) { + return null; + } + + try { + const runtimeData = typeof canvas.getData === "function" ? canvas.getData() : canvas.data; + return runtimeData && typeof runtimeData === "object" ? runtimeData : null; + } catch { + return null; + } + } + + async readCanvasFileData(file) { + const raw = await this.app.vault.cachedRead(file); + try { + return JSON.parse(raw); + } catch { + throw new Error(`Unable to parse canvas JSON for ${file.path}`); + } + } + + getCachedCanvasNodeText(canvasPath, nodeId) { + if (!this.plugin || typeof this.plugin.getCanvasNodeEditorText !== "function") { + return undefined; + } + return this.plugin.getCanvasNodeEditorText(canvasPath, nodeId); + } + + async resolveCanvasSelection(file, selectedNodeIds, options = {}) { + const resolvedView = String(options.view?.file?.path || "").trim() === String(file?.path || "").trim() + ? options.view + : this.getCanvasViewForFile(file); + const liveSelectedNodeDataById = options.liveNodeDataById instanceof Map + ? new Map(options.liveNodeDataById) + : new Map(); + this.extractLiveSelectedNodeDataById(resolvedView, selectedNodeIds).forEach((nodeData, nodeId) => { + const previous = liveSelectedNodeDataById.get(nodeId) || {}; + liveSelectedNodeDataById.set(nodeId, { ...previous, ...nodeData }); + }); + + const selectedIdSet = new Set(selectedNodeIds.map((nodeId) => String(nodeId))); + const selectedNodesById = new Map(); + const rememberSelectedNodes = (nodes) => { + (Array.isArray(nodes) ? nodes : []).forEach((node) => { + const nodeId = String(node?.id || "").trim(); + if (!nodeId || !selectedIdSet.has(nodeId) || selectedNodesById.has(nodeId)) { + return; + } + selectedNodesById.set(nodeId, node); + }); + }; + + const runtimeData = this.getCanvasRuntimeData(resolvedView); + rememberSelectedNodes(runtimeData?.nodes); + + if (selectedNodesById.size < selectedIdSet.size) { + const parsed = await this.readCanvasFileData(file); + rememberSelectedNodes(parsed?.nodes); + } + + const selectedNodes = Array.from(selectedNodesById.values()) + .map((node) => { + const liveNodeData = liveSelectedNodeDataById.get(String(node?.id || "")); + const mergedNode = liveNodeData ? { ...node, ...liveNodeData } : { ...node }; + const cachedText = this.getCachedCanvasNodeText(file?.path, mergedNode?.id); + if (cachedText !== undefined && String(mergedNode?.type || "") === "text") { + mergedNode.text = cachedText; + } + return mergedNode; + }) + .sort(compareCanvasNodeOrder); + + if (selectedNodes.length === 0) { + throw new Error("The Canvas does not contain the current selection."); + } + + const textBlocks = []; + const markdownFiles = []; + const imageFiles = []; + const warnings = []; + + for (const node of selectedNodes) { + const nodeId = String(node.id || ""); + if (!nodeId) { + continue; + } + + if (node.type === "text") { + const text = typeof node.text === "string" ? node.text.trim() : ""; + if (text) { + textBlocks.push({ id: nodeId, text }); + } else { + warnings.push(`Text node ${nodeId} is empty.`); + } + continue; + } + + if (node.type === "file") { + const selectionEntry = await this.buildCanvasFileSelectionEntry(node, warnings); + if (selectionEntry?.kind === "markdown") { + markdownFiles.push(selectionEntry.value); + } else if (selectionEntry?.kind === "image") { + imageFiles.push(selectionEntry.value); + } + continue; + } + + warnings.push(`Unsupported canvas node type skipped: ${node.type || "unknown"}`); + } + + const normalizedNodeIds = selectedNodes + .map((node) => String(node.id)) + .filter(Boolean) + .sort(); + + return { + canvasPath: file.path, + canvasName: file.basename, + nodeIds: normalizedNodeIds, + textBlocks, + markdownFiles, + imageFiles, + warnings, + title: this.deriveTitle(file.basename, textBlocks, markdownFiles, imageFiles), + }; + } + + getCanvasNodeCenter(node) { + return getCanvasNodeCenter(node); + } + + doesCanvasGroupContainNode(groupNode, candidateNode) { + return doesCanvasGroupContainNode(groupNode, candidateNode); + } + + findSmallestCanvasGroupForNode(nodes, candidateNode) { + if (!Array.isArray(nodes) || !candidateNode) { + return null; + } + + const containingGroups = nodes + .filter((node) => this.doesCanvasGroupContainNode(node, candidateNode)) + .sort((a, b) => ( + (Math.max(0, toFiniteNumber(a?.width, 0)) * Math.max(0, toFiniteNumber(a?.height, 0))) + - (Math.max(0, toFiniteNumber(b?.width, 0)) * Math.max(0, toFiniteNumber(b?.height, 0))) + )); + + return containingGroups[0] || null; + } + + async buildCanvasFileSelectionEntry(node, warnings) { + const filePath = typeof node?.file === "string" ? node.file.trim() : ""; + const abstractFile = await this.waitForCanvasFile(filePath); + if (!(abstractFile instanceof TFile)) { + warnings.push(`Missing file node target: ${filePath}`); + return null; + } + + const vaultBasePath = this.getVaultBasePath(); + const baseEntry = { + id: String(node?.id || ""), + path: abstractFile.path, + absolutePath: vaultBasePath + ? this.resolveVaultPath(vaultBasePath, abstractFile.path) + : "", + name: abstractFile.basename, + }; + + if (abstractFile.extension === "md") { + return { + kind: "markdown", + value: { + ...baseEntry, + content: await this.app.vault.cachedRead(abstractFile), + }, + }; + } + + if (this.isSupportedCanvasImageFile(abstractFile)) { + return { + kind: "image", + value: { + ...baseEntry, + mimeType: this.getCanvasImageMimeType(abstractFile), + }, + }; + } + + warnings.push(`Unsupported file node type skipped: ${filePath}`); + return null; + } + + isSupportedCanvasImageFile(file) { + const extension = String(file?.extension || "").trim().toLowerCase(); + return extension === "png" + || extension === "jpg" + || extension === "jpeg" + || extension === "gif" + || extension === "webp"; + } + + getCanvasImageMimeType(file) { + const extension = String(file?.extension || "").trim().toLowerCase(); + if (extension === "jpg" || extension === "jpeg") { + return "image/jpeg"; + } + if (extension === "gif") { + return "image/gif"; + } + if (extension === "webp") { + return "image/webp"; + } + return "image/png"; + } + + async waitForCanvasFile(filePath, options = {}) { + const normalizedPath = String(filePath || "").trim(); + const timeoutMs = Math.max(0, toFiniteNumber(options.timeoutMs, 4_000)); + const pollMs = Math.max(25, toFiniteNumber(options.pollMs, 100)); + const deadline = Date.now() + timeoutMs; + + while (true) { + const abstractFile = this.app.vault.getAbstractFileByPath(normalizedPath); + if (!normalizedPath || abstractFile instanceof TFile) { + return abstractFile || null; + } + + if (Date.now() >= deadline) { + return abstractFile || null; + } + + await sleep(pollMs); + } + } + + collectConnectedCanvasNodeIds(edges, sourceNodeId) { + const normalizedSourceNodeId = String(sourceNodeId || "").trim(); + const connectedNodeIds = new Set(); + if (!normalizedSourceNodeId || !Array.isArray(edges)) { + return connectedNodeIds; + } + + edges.forEach((edge) => { + const fromNodeId = String(edge?.fromNode || "").trim(); + const toNodeId = String(edge?.toNode || "").trim(); + if (fromNodeId === normalizedSourceNodeId && toNodeId) { + connectedNodeIds.add(toNodeId); + } + if (toNodeId === normalizedSourceNodeId && fromNodeId) { + connectedNodeIds.add(fromNodeId); + } + }); + + return connectedNodeIds; + } + + async appendImplicitCanvasFiles(nodes, warnings, collectedMarkdownFiles, collectedImageFiles, seenNodeIds, predicate) { + const candidateNodes = (Array.isArray(nodes) ? nodes : []) + .filter((node) => { + const nodeId = String(node?.id || "").trim(); + return nodeId + && !seenNodeIds.has(nodeId) + && String(node?.type || "").trim() === "file" + && predicate(node); + }) + .sort(compareCanvasNodeOrder); + + for (const node of candidateNodes) { + const selectionEntry = await this.buildCanvasFileSelectionEntry(node, warnings); + const fileEntry = selectionEntry?.value || null; + if (!fileEntry) { + continue; + } + + const nodeId = String(fileEntry.id || "").trim(); + if (!nodeId || seenNodeIds.has(nodeId)) { + continue; + } + + seenNodeIds.add(nodeId); + if (selectionEntry.kind === "markdown") { + collectedMarkdownFiles.push(fileEntry); + } else if (selectionEntry.kind === "image") { + collectedImageFiles.push(fileEntry); + } + } + } + + async addImplicitCanvasFileContext(selection) { + const canvasPath = String(selection?.canvasPath || "").trim(); + const nodeIds = Array.isArray(selection?.nodeIds) ? selection.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) : []; + const textBlocks = Array.isArray(selection?.textBlocks) ? selection.textBlocks : []; + const markdownFiles = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles : []; + const imageFiles = Array.isArray(selection?.imageFiles) ? selection.imageFiles : []; + if (!canvasPath || nodeIds.length !== 1 || textBlocks.length !== 1 || (markdownFiles.length > 0 || imageFiles.length > 0)) { + return selection; + } + + const abstractFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + return selection; + } + + const resolvedView = this.getCanvasViewForFile(canvasPath); + let parsed = this.getCanvasRuntimeData(resolvedView); + if (!parsed || !Array.isArray(parsed?.nodes) || !Array.isArray(parsed?.edges)) { + try { + parsed = await this.readCanvasFileData(abstractFile); + } catch { + return selection; + } + } + + const nodes = Array.isArray(parsed?.nodes) ? parsed.nodes : []; + const sourceNodeId = nodeIds[0]; + const sourceNode = nodes.find((node) => String(node?.id || "") === sourceNodeId) || null; + if ((!sourceNode || String(sourceNode?.type || "") !== "text") && parsed !== null) { + try { + const diskParsed = await this.readCanvasFileData(abstractFile); + parsed = diskParsed; + } catch { + return selection; + } + } + + const effectiveNodes = Array.isArray(parsed?.nodes) ? parsed.nodes : []; + const effectiveSourceNode = effectiveNodes.find((node) => String(node?.id || "") === sourceNodeId) || null; + if (!effectiveSourceNode || String(effectiveSourceNode?.type || "") !== "text") { + return selection; + } + + const edges = Array.isArray(parsed?.edges) ? parsed.edges : []; + const implicitMarkdownFiles = []; + const implicitImageFiles = []; + const nextWarnings = Array.isArray(selection?.warnings) ? [...selection.warnings] : []; + const seenNodeIds = new Set([ + ...markdownFiles.map((file) => String(file?.id || "").trim()), + ...imageFiles.map((file) => String(file?.id || "").trim()), + ].filter(Boolean)); + const connectedNodeIds = this.collectConnectedCanvasNodeIds(edges, sourceNodeId); + await this.appendImplicitCanvasFiles( + effectiveNodes, + nextWarnings, + implicitMarkdownFiles, + implicitImageFiles, + seenNodeIds, + (node) => connectedNodeIds.has(String(node?.id || "").trim()) + ); + + const containingGroup = this.findSmallestCanvasGroupForNode(effectiveNodes, effectiveSourceNode); + if (containingGroup) { + await this.appendImplicitCanvasFiles( + effectiveNodes, + nextWarnings, + implicitMarkdownFiles, + implicitImageFiles, + seenNodeIds, + (node) => String(node?.id || "").trim() !== sourceNodeId + && this.doesCanvasGroupContainNode(containingGroup, node) + ); + } + + if (implicitMarkdownFiles.length === 0 && implicitImageFiles.length === 0) { + return selection; + } + + return { + ...selection, + markdownFiles: implicitMarkdownFiles, + imageFiles: implicitImageFiles, + warnings: nextWarnings, + }; + } + + async addImplicitCanvasMarkdownContext(selection) { + return this.addImplicitCanvasFileContext(selection); + } + + async addImplicitGroupMarkdownContext(selection) { + return this.addImplicitCanvasFileContext(selection); + } + + deriveTitle(canvasName, textBlocks, markdownFiles, imageFiles = []) { + if (textBlocks.length > 0) { + const firstLine = textBlocks[0].text.split("\n")[0].trim(); + if (firstLine) { + return firstLine.slice(0, 80); + } + } + + if (markdownFiles.length > 0) { + return markdownFiles[0].name || markdownFiles[0].path; + } + + if (imageFiles.length > 0) { + return imageFiles[0].name || imageFiles[0].path; + } + + return `${canvasName} selection`; + } + + normalizeCanvasNodeData(value) { + if (!value || typeof value !== "object") { + return null; + } + + const nodeId = String(value.id || "").trim(); + if (!nodeId) { + return null; + } + + const normalized = { id: nodeId }; + const nodeType = String(value.type || "").trim(); + if (nodeType) { + normalized.type = nodeType; + } + + if (typeof value.text === "string") { + normalized.text = value.text; + } + + if (typeof value.file === "string") { + normalized.file = value.file; + } + + if (typeof value.subpath === "string") { + normalized.subpath = value.subpath; + } + + return normalized; + } + + extractEditableText(element) { + if (!element) { + return ""; + } + + if (typeof element.value === "string") { + return element.value; + } + + const cmContent = element.matches?.(".cm-content") + ? element + : element.querySelector?.(".cm-content"); + if (cmContent) { + const lines = Array.from(cmContent.querySelectorAll?.(".cm-line") || []); + if (lines.length > 0) { + return lines.map((line) => line.textContent || "").join("\n"); + } + return typeof cmContent.textContent === "string" ? cmContent.textContent : ""; + } + + return typeof element.textContent === "string" ? element.textContent : ""; + } + + rememberDomTextForNodeElement(element, selectedIdSet, textById) { + const nodeId = String(element?.getAttribute?.("data-node-id") || "").trim(); + if (!nodeId || (selectedIdSet.size > 0 && !selectedIdSet.has(nodeId))) { + return; + } + + const editor = element.querySelector?.("textarea, input, [contenteditable='true'], .cm-content"); + if (!editor) { + return; + } + + const liveText = this.extractEditableText(editor); + if (typeof liveText === "string") { + textById.set(nodeId, liveText); + } + } + + extractSelectedDomTextById(view, selectedIdSet) { + const selectedElements = view?.containerEl?.querySelectorAll?.( + "[data-node-id].is-selected, .canvas-node.is-selected[data-node-id], .canvas-node[data-node-id][aria-selected='true']" + ); + const textById = new Map(); + selectedElements?.forEach((element) => this.rememberDomTextForNodeElement(element, selectedIdSet, textById)); + + const activeElement = view?.containerEl?.ownerDocument?.activeElement; + const activeNodeElement = activeElement?.closest?.("[data-node-id]"); + if (activeNodeElement && view?.containerEl?.contains?.(activeNodeElement)) { + this.rememberDomTextForNodeElement(activeNodeElement, selectedIdSet, textById); + } + + return textById; + } + + extractLiveSelectedNodeDataById(view, selectedNodeIds) { + const selectedIdSet = new Set( + (Array.isArray(selectedNodeIds) ? selectedNodeIds : []) + .map((nodeId) => String(nodeId || "").trim()) + .filter(Boolean) + ); + const collected = new Map(); + const visited = new WeakSet(); + const canvas = view?.canvas; + + const rememberNodeData = (candidate) => { + const normalized = this.normalizeCanvasNodeData(candidate); + if (!normalized || !selectedIdSet.has(normalized.id)) { + return; + } + + const previous = collected.get(normalized.id) || {}; + collected.set(normalized.id, { ...previous, ...normalized }); + }; + + const ingest = (value) => { + if (!value) { + return; + } + + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + return; + } + + if (typeof value.getData === "function") { + try { + rememberNodeData(value.getData()); + } catch { + // Ignore runtime node wrappers that throw while being inspected. + } + } + + if (Array.isArray(value)) { + value.forEach(ingest); + return; + } + + if (value instanceof Set) { + value.forEach(ingest); + return; + } + + if (value instanceof Map) { + value.forEach((mapValue) => { + rememberNodeData(mapValue); + ingest(mapValue); + }); + return; + } + + if (typeof value !== "object") { + return; + } + + if (visited.has(value)) { + return; + } + visited.add(value); + + rememberNodeData(value); + rememberNodeData(value.data); + rememberNodeData(value.node); + rememberNodeData(value.node?.data); + rememberNodeData(value.item); + rememberNodeData(value.item?.data); + + [ + value.node, + value.data, + value.item, + value.items, + value.nodes, + value.values, + value.selection, + value.selectedNodes, + ].forEach(ingest); + }; + + ingest(canvas?.selection); + ingest(canvas?.selectionManager?.selection); + ingest(canvas?.selectionManager?.selectedNodes); + ingest(canvas?.selectedNodes); + + if (collected.size < selectedIdSet.size) { + ingest(canvas?.nodes); + } + + const domTextById = this.extractSelectedDomTextById(view, selectedIdSet); + domTextById.forEach((text, nodeId) => { + const previous = collected.get(nodeId) || { id: nodeId, type: "text" }; + collected.set(nodeId, { + ...previous, + id: nodeId, + type: previous.type || "text", + text, + }); + }); + + return collected; + } + + extractSelectedNodeIds(view) { + const canvas = view?.canvas; + const selectedElements = view?.containerEl?.querySelectorAll?.( + "[data-node-id].is-selected, .canvas-node.is-selected[data-node-id], .canvas-node[data-node-id][aria-selected='true']" + ); + const domSelectedNodeIds = new Set(); + if (selectedElements) { + selectedElements.forEach((element) => { + const nodeId = element.getAttribute("data-node-id"); + if (nodeId) { + domSelectedNodeIds.add(String(nodeId)); + } + }); + } + + if (domSelectedNodeIds.size > 0) { + return Array.from(domSelectedNodeIds); + } + + const collected = new Set(); + const visited = new WeakSet(); + const addNodeId = (value) => { + if (typeof value === "string" || typeof value === "number") { + collected.add(String(value)); + } + }; + + const ingest = (value) => { + if (!value) { + return; + } + + if (typeof value === "string" || typeof value === "number") { + addNodeId(value); + return; + } + + if (Array.isArray(value)) { + value.forEach(ingest); + return; + } + + if (value instanceof Set) { + value.forEach(ingest); + return; + } + + if (value instanceof Map) { + value.forEach((mapValue, key) => { + ingest(mapValue); + addNodeId(key); + }); + return; + } + + if (typeof value !== "object") { + return; + } + + if (visited.has(value)) { + return; + } + visited.add(value); + + addNodeId(value.id); + addNodeId(value.node?.id); + addNodeId(value.data?.id); + addNodeId(value.item?.id); + + [ + value.node, + value.data, + value.item, + value.items, + value.nodes, + value.values, + value.selection, + value.selectedNodes, + ].forEach(ingest); + }; + + ingest(canvas?.selection); + ingest(canvas?.selectionManager?.selection); + ingest(canvas?.selectionManager?.selectedNodes); + ingest(canvas?.selectedNodes); + + return Array.from(collected); + } + + inferWorkingDirectory(selection) { + const vaultBasePath = this.getVaultBasePath(); + if (!vaultBasePath) { + return ""; + } + + const candidatePaths = [ + this.resolveVaultPath(vaultBasePath, selection.canvasPath), + ...selection.markdownFiles.map((file) => this.resolveVaultPath(vaultBasePath, file.path)), + ].filter(Boolean); + + for (const candidatePath of candidatePaths) { + const repoRoot = this.findNearestGitRoot(candidatePath); + if (repoRoot) { + return repoRoot; + } + } + + for (const candidatePath of candidatePaths) { + const existingDirectory = this.findNearestExistingDirectory(candidatePath); + if (existingDirectory) { + return existingDirectory; + } + } + + return ""; + } + + getVaultBasePath() { + const adapter = this.app.vault?.adapter; + if (typeof adapter?.getBasePath === "function") { + return adapter.getBasePath(); + } + if (typeof adapter?.basePath === "string" && adapter.basePath.trim()) { + return adapter.basePath.trim(); + } + if (typeof adapter?.path === "string" && adapter.path.trim()) { + return adapter.path.trim(); + } + return ""; + } + + resolveVaultPath(vaultBasePath, relativePath) { + const trimmedPath = String(relativePath || "").trim(); + if (!trimmedPath) { + return ""; + } + + return path.resolve(vaultBasePath, trimmedPath); + } + + findNearestGitRoot(startPath) { + let currentPath = this.findNearestExistingDirectory(startPath); + while (currentPath) { + const gitPath = path.join(currentPath, ".git"); + if (fs.existsSync(gitPath)) { + return currentPath; + } + + const parentPath = path.dirname(currentPath); + if (parentPath === currentPath) { + return ""; + } + currentPath = parentPath; + } + + return ""; + } + + findNearestExistingDirectory(startPath) { + let currentPath = String(startPath || "").trim(); + if (!currentPath) { + return ""; + } + + if (fs.existsSync(currentPath)) { + const stats = fs.statSync(currentPath); + return stats.isDirectory() ? currentPath : path.dirname(currentPath); + } + + currentPath = path.dirname(currentPath); + while (currentPath && currentPath !== path.dirname(currentPath)) { + if (fs.existsSync(currentPath) && fs.statSync(currentPath).isDirectory()) { + return currentPath; + } + currentPath = path.dirname(currentPath); + } + + if (currentPath && fs.existsSync(currentPath) && fs.statSync(currentPath).isDirectory()) { + return currentPath; + } + + return ""; + } +} + +class OpenAgentVoiceGraphView extends ItemView { + constructor(leaf, plugin) { + super(leaf); + this.plugin = plugin; + this.canvas = null; + this.ctx = null; + this.statusEl = null; + this.volumeEl = null; + this.nodeCountEl = null; + this.dictationInputEl = null; + this.dictationSendButtonEl = null; + this.sensitivityInput = null; + this.nodes = []; + this.edges = []; + this.nodeByPath = new Map(); + this.animationFrameId = 0; + this.resizeObserver = null; + this.audioContext = null; + this.audioAnalyser = null; + this.audioData = null; + this.mediaStream = null; + this.audioLevel = 0; + this.frequencyTilt = 0; + this.isMicActive = false; + this.realtimePeerConnection = null; + this.realtimeDataChannel = null; + this.realtimeRemoteAudioEl = null; + this.realtimeSessionId = ""; + this.realtimeStreamDisposer = null; + this.isDictating = false; + this.dictationTranscript = ""; + this.dictationIsSending = false; + this.sensitivity = 1.35; + this.hoveredNode = null; + this.draggingNode = null; + this.isPanning = false; + this.panX = 0; + this.panY = 0; + this.zoom = 1; + this.pointerStart = null; + this.lastFrameAt = 0; + } + + getViewType() { + return VOICE_GRAPH_VIEW_TYPE; + } + + getDisplayText() { + return "Voice Graph"; + } + + getIcon() { + return "audio-lines"; + } + + async onOpen() { + this.render(); + this.rebuildGraph(); + this.startAnimation(); + this.registerEvent(this.app.metadataCache.on("changed", () => this.scheduleGraphRefresh())); + this.registerEvent(this.app.metadataCache.on("resolved", () => this.scheduleGraphRefresh())); + } + + async onClose() { + window.clearTimeout(this.graphRefreshTimer); + this.graphRefreshTimer = null; + this.stopAnimation(); + this.stopDictation(); + this.stopMic(); + this.resizeObserver?.disconnect(); + this.resizeObserver = null; + this.contentEl.empty(); + } + + render() { + this.contentEl.empty(); + this.contentEl.addClass("oa-voice-graph-view"); + + const toolbar = this.contentEl.createDiv({ cls: "oa-voice-graph-toolbar" }); + const title = toolbar.createDiv({ cls: "oa-voice-graph-title" }); + title.createEl("span", { text: "Voice Graph" }); + this.statusEl = title.createEl("small", { text: "Ambient mode" }); + + const controls = toolbar.createDiv({ cls: "oa-voice-graph-controls" }); + const micButton = controls.createEl("button", { + cls: "clickable-icon oa-voice-graph-icon-button", + attr: { "aria-label": "Start microphone" }, + }); + setIcon(micButton, "mic"); + setTooltip(micButton, "Animate graph from microphone"); + micButton.addEventListener("click", () => { + void this.startMic(); + }); + + const stopButton = controls.createEl("button", { + cls: "clickable-icon oa-voice-graph-icon-button", + attr: { "aria-label": "Stop microphone" }, + }); + setIcon(stopButton, "mic-off"); + setTooltip(stopButton, "Stop microphone animation"); + stopButton.addEventListener("click", () => this.stopMic()); + + const refreshButton = controls.createEl("button", { + cls: "clickable-icon oa-voice-graph-icon-button", + attr: { "aria-label": "Refresh graph" }, + }); + setIcon(refreshButton, "refresh-cw"); + setTooltip(refreshButton, "Refresh graph"); + refreshButton.addEventListener("click", () => this.rebuildGraph()); + + const centerButton = controls.createEl("button", { + cls: "clickable-icon oa-voice-graph-icon-button", + attr: { "aria-label": "Center graph" }, + }); + setIcon(centerButton, "scan"); + setTooltip(centerButton, "Center graph"); + centerButton.addEventListener("click", () => this.centerGraph()); + + const dictateButton = controls.createEl("button", { + cls: "clickable-icon oa-voice-graph-icon-button", + attr: { "aria-label": "Start dictation" }, + }); + setIcon(dictateButton, "message-circle"); + setTooltip(dictateButton, "Dictate a message"); + dictateButton.addEventListener("click", () => this.toggleDictation()); + + const sensitivityWrap = controls.createDiv({ cls: "oa-voice-graph-slider" }); + sensitivityWrap.createEl("span", { text: "Sensitivity" }); + this.sensitivityInput = sensitivityWrap.createEl("input", { + attr: { + type: "range", + min: "0.5", + max: "3", + step: "0.05", + value: String(this.sensitivity), + }, + }); + this.sensitivityInput.addEventListener("input", () => { + this.sensitivity = Number(this.sensitivityInput?.value || 1.35); + }); + + const stage = this.contentEl.createDiv({ cls: "oa-voice-graph-stage" }); + this.canvas = stage.createEl("canvas", { cls: "oa-voice-graph-canvas" }); + this.ctx = this.canvas.getContext("2d"); + const hud = stage.createDiv({ cls: "oa-voice-graph-hud" }); + this.nodeCountEl = hud.createEl("span", { text: "0 notes" }); + this.volumeEl = hud.createEl("span", { text: "signal 0%" }); + const dictationDock = stage.createDiv({ cls: "oa-voice-graph-dictation" }); + this.dictationInputEl = dictationDock.createEl("textarea", { + attr: { + rows: "2", + placeholder: "Click the dictation button, or type here...", + }, + }); + this.dictationInputEl.addEventListener("input", () => { + this.dictationTranscript = String(this.dictationInputEl?.value || ""); + this.updateDictationSendState(); + }); + this.dictationSendButtonEl = dictationDock.createEl("button", { text: "Send" }); + this.dictationSendButtonEl.addEventListener("click", () => { + void this.sendDictation(); + }); + this.updateDictationSendState(); + + this.registerCanvasEvents(); + this.resizeObserver = new ResizeObserver(() => this.resizeCanvas()); + this.resizeObserver.observe(stage); + this.resizeCanvas(); + } + + registerCanvasEvents() { + this.canvas.addEventListener("pointerdown", (event) => { + const point = this.getGraphPoint(event); + const node = this.findNodeAt(point.x, point.y); + this.pointerStart = { clientX: event.clientX, clientY: event.clientY, panX: this.panX, panY: this.panY }; + if (node) { + this.draggingNode = node; + node.fixed = true; + } else { + this.isPanning = true; + } + this.canvas.setPointerCapture(event.pointerId); + }); + this.canvas.addEventListener("pointermove", (event) => { + const point = this.getGraphPoint(event); + this.hoveredNode = this.findNodeAt(point.x, point.y); + this.canvas.style.cursor = this.draggingNode ? "grabbing" : (this.hoveredNode ? "pointer" : (this.isPanning ? "grabbing" : "grab")); + if (this.draggingNode) { + this.draggingNode.x = point.x; + this.draggingNode.y = point.y; + this.draggingNode.vx = 0; + this.draggingNode.vy = 0; + } else if (this.isPanning && this.pointerStart) { + this.panX = this.pointerStart.panX + event.clientX - this.pointerStart.clientX; + this.panY = this.pointerStart.panY + event.clientY - this.pointerStart.clientY; + } + }); + this.canvas.addEventListener("pointerup", (event) => this.finishPointer(event)); + this.canvas.addEventListener("pointercancel", (event) => this.finishPointer(event)); + this.canvas.addEventListener("dblclick", (event) => { + const point = this.getGraphPoint(event); + const node = this.findNodeAt(point.x, point.y); + if (node) { + void this.app.workspace.openLinkText(node.path, "", false); + } + }); + this.canvas.addEventListener("wheel", (event) => { + event.preventDefault(); + const before = this.getGraphPoint(event); + const factor = event.deltaY > 0 ? 0.92 : 1.08; + this.zoom = Math.max(0.35, Math.min(2.8, this.zoom * factor)); + const after = this.getGraphPoint(event); + this.panX += (after.x - before.x) * this.zoom; + this.panY += (after.y - before.y) * this.zoom; + }, { passive: false }); + } + + finishPointer(event) { + if (this.draggingNode) { + this.draggingNode.fixed = false; + } + this.draggingNode = null; + this.isPanning = false; + this.pointerStart = null; + try { + this.canvas.releasePointerCapture(event.pointerId); + } catch { + // Pointer capture can already be gone if Obsidian moved focus. + } + } + + resizeCanvas() { + if (!this.canvas) { + return; + } + const rect = this.canvas.getBoundingClientRect(); + const ratio = window.devicePixelRatio || 1; + const width = Math.max(1, Math.floor(rect.width * ratio)); + const height = Math.max(1, Math.floor(rect.height * ratio)); + if (this.canvas.width !== width || this.canvas.height !== height) { + this.canvas.width = width; + this.canvas.height = height; + this.centerGraph({ keepZoom: true }); + } + } + + scheduleGraphRefresh() { + window.clearTimeout(this.graphRefreshTimer); + this.graphRefreshTimer = window.setTimeout(() => this.rebuildGraph(), 300); + } + + rebuildGraph() { + const files = this.app.vault.getMarkdownFiles(); + const fileByPath = new Map(files.map((file) => [file.path, file])); + const degreeByPath = new Map(files.map((file) => [file.path, 0])); + const rawEdges = []; + const resolvedLinks = this.app.metadataCache.resolvedLinks || {}; + Object.entries(resolvedLinks).forEach(([sourcePath, links]) => { + if (!fileByPath.has(sourcePath)) { + return; + } + Object.entries(links || {}).forEach(([targetPath, count]) => { + if (!fileByPath.has(targetPath) || sourcePath === targetPath) { + return; + } + const weight = Math.max(1, Number(count || 1)); + rawEdges.push({ sourcePath, targetPath, weight }); + degreeByPath.set(sourcePath, (degreeByPath.get(sourcePath) || 0) + weight); + degreeByPath.set(targetPath, (degreeByPath.get(targetPath) || 0) + weight); + }); + }); + + const activePath = this.app.workspace.getActiveFile()?.path || ""; + const selectedPaths = files + .map((file) => ({ + file, + score: (degreeByPath.get(file.path) || 0) + (file.path === activePath ? 1_000 : 0), + })) + .sort((a, b) => b.score - a.score || a.file.path.localeCompare(b.file.path)) + .slice(0, VOICE_GRAPH_MAX_NODES) + .map((entry) => entry.file.path); + const selectedSet = new Set(selectedPaths); + const previousByPath = this.nodeByPath; + this.nodeByPath = new Map(); + this.nodes = selectedPaths.map((filePath, index) => { + const file = fileByPath.get(filePath); + const previous = previousByPath.get(filePath); + const angle = (Math.PI * 2 * index) / Math.max(1, selectedPaths.length); + const radius = 170 + 7 * Math.sqrt(index); + const degree = degreeByPath.get(filePath) || 0; + const node = { + path: filePath, + label: file?.basename || path.basename(filePath, ".md"), + x: previous?.x ?? Math.cos(angle) * radius, + y: previous?.y ?? Math.sin(angle) * radius, + vx: previous?.vx ?? 0, + vy: previous?.vy ?? 0, + radius: Math.min(VOICE_GRAPH_MAX_NODE_RADIUS, VOICE_GRAPH_MIN_NODE_RADIUS + Math.sqrt(degree) * 1.7), + pulse: Math.random() * Math.PI * 2, + degree, + fixed: false, + }; + this.nodeByPath.set(filePath, node); + return node; + }); + this.edges = rawEdges + .filter((edge) => selectedSet.has(edge.sourcePath) && selectedSet.has(edge.targetPath)) + .slice(0, VOICE_GRAPH_MAX_EDGES) + .map((edge) => ({ + source: this.nodeByPath.get(edge.sourcePath), + target: this.nodeByPath.get(edge.targetPath), + weight: edge.weight, + })) + .filter((edge) => edge.source && edge.target); + this.nodeCountEl?.setText(`${this.nodes.length} notes, ${this.edges.length} links`); + this.centerGraph({ keepZoom: true }); + } + + centerGraph(options = {}) { + const rect = this.canvas?.getBoundingClientRect(); + if (!rect) { + return; + } + this.panX = rect.width / 2; + this.panY = rect.height / 2; + if (!options.keepZoom) { + this.zoom = 1; + } + } + + async startMic() { + if (this.isMicActive) { + return this.mediaStream; + } + try { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false }); + const AudioContextCtor = window.AudioContext || window.webkitAudioContext; + this.audioContext = new AudioContextCtor(); + const source = this.audioContext.createMediaStreamSource(stream); + this.audioAnalyser = this.audioContext.createAnalyser(); + this.audioAnalyser.fftSize = 512; + this.audioAnalyser.smoothingTimeConstant = 0.72; + this.audioData = new Uint8Array(this.audioAnalyser.frequencyBinCount); + source.connect(this.audioAnalyser); + this.mediaStream = stream; + this.isMicActive = true; + this.statusEl?.setText("Listening"); + return stream; + } catch (error) { + this.statusEl?.setText("Mic unavailable"); + new Notice(`Voice Graph could not start the microphone: ${error.message || error}`); + throw error; + } + } + + stopMic() { + if (this.isDictating) { + this.stopDictation(); + } + this.mediaStream?.getTracks?.().forEach((track) => track.stop()); + this.mediaStream = null; + this.audioContext?.close?.().catch(() => {}); + this.audioContext = null; + this.audioAnalyser = null; + this.audioData = null; + this.isMicActive = false; + this.audioLevel = 0; + this.frequencyTilt = 0; + this.statusEl?.setText("Ambient mode"); + } + + toggleDictation() { + if (this.isDictating) { + this.stopDictation(); + return; + } + this.startDictation(); + } + + async startDictation() { + if (this.isDictating) { + return; + } + this.stopDictation({ stopServer: false }); + this.isDictating = true; + this.statusEl?.setText("Starting voice mode"); + this.updateDictationSendState(); + + try { + await this.startMic(); + const offerSdp = await this.createRealtimeWebRtcOffer(); + const context = this.plugin.getVaultPetQuickChatContext(); + const response = await this.plugin.api.startVoiceRealtime({ + cwd: context.cwd || this.plugin.getVaultBasePath(), + outputModality: "text", + offerSdp, + prompt: [ + "You are OpenAgent Voice Graph inside Obsidian.", + "Transcribe the user's speech accurately, including Vietnamese.", + "Keep assistant responses concise. The UI primarily uses the user transcript as a prompt.", + ].join(" "), + runtimeConfig: this.plugin.buildRuntimeConfigPayload(), + }); + this.realtimeSessionId = String(response.sessionId || ""); + if (!this.realtimeSessionId) { + throw new Error("OpenAgent daemon did not return a realtime session id."); + } + const answerSdp = String(response.answerSdp || "").trim(); + if (!answerSdp) { + throw new Error("OpenAgent daemon did not return a realtime SDP answer."); + } + await this.applyRealtimeWebRtcAnswer(answerSdp); + this.openRealtimeTranscriptStream(this.realtimeSessionId); + this.statusEl?.setText("Voice mode"); + } catch (error) { + this.stopDictation({ stopServer: true }); + new Notice(`Voice Graph could not start Codex voice mode: ${error.message || error}`); + } + } + + async createRealtimeWebRtcOffer() { + const PeerConnectionCtor = window.RTCPeerConnection || window.webkitRTCPeerConnection; + if (!PeerConnectionCtor) { + throw new Error("WebRTC is not available in this Obsidian runtime."); + } + if (!this.mediaStream) { + throw new Error("Microphone stream is not active."); + } + const audioTracks = this.mediaStream.getAudioTracks?.() || []; + if (!audioTracks.length) { + throw new Error("Microphone stream does not contain an audio track."); + } + + this.stopRealtimePeerConnection(); + const peerConnection = new PeerConnectionCtor({ iceServers: [] }); + this.realtimePeerConnection = peerConnection; + this.realtimeDataChannel = peerConnection.createDataChannel("oai-events", { ordered: true }); + + peerConnection.onconnectionstatechange = () => { + const state = String(peerConnection.connectionState || ""); + if (state === "connected") { + this.statusEl?.setText("Voice mode"); + } else if (state === "failed" || state === "disconnected") { + this.statusEl?.setText("Voice connection interrupted"); + } + }; + peerConnection.ontrack = (event) => { + const stream = event.streams?.[0]; + if (!stream) { + return; + } + if (!this.realtimeRemoteAudioEl) { + this.realtimeRemoteAudioEl = document.createElement("audio"); + this.realtimeRemoteAudioEl.autoplay = true; + this.realtimeRemoteAudioEl.hidden = true; + this.contentEl.appendChild(this.realtimeRemoteAudioEl); + } + this.realtimeRemoteAudioEl.srcObject = stream; + void this.realtimeRemoteAudioEl.play?.().catch(() => {}); + }; + + for (const track of audioTracks) { + peerConnection.addTransceiver(track, { direction: "sendrecv" }); + } + + const offer = await peerConnection.createOffer({ + offerToReceiveAudio: true, + offerToReceiveVideo: false, + }); + await peerConnection.setLocalDescription(offer); + await this.waitForRealtimeIceGathering(peerConnection, 5_000); + const sdp = String(peerConnection.localDescription?.sdp || "").trim(); + if (!sdp) { + throw new Error("WebRTC did not produce a local SDP offer."); + } + return sdp; + } + + waitForRealtimeIceGathering(peerConnection, timeoutMs) { + if (peerConnection.iceGatheringState === "complete") { + return Promise.resolve(); + } + return new Promise((resolve) => { + let settled = false; + const finish = () => { + if (settled) { + return; + } + settled = true; + window.clearTimeout(timer); + peerConnection.removeEventListener("icegatheringstatechange", onIceGatheringStateChange); + resolve(); + }; + const onIceGatheringStateChange = () => { + if (peerConnection.iceGatheringState === "complete") { + finish(); + } + }; + const timer = window.setTimeout(finish, timeoutMs); + peerConnection.addEventListener("icegatheringstatechange", onIceGatheringStateChange); + }); + } + + async applyRealtimeWebRtcAnswer(answerSdp) { + if (!this.realtimePeerConnection) { + throw new Error("WebRTC peer connection is not active."); + } + await this.realtimePeerConnection.setRemoteDescription({ + type: "answer", + sdp: answerSdp, + }); + } + + openRealtimeTranscriptStream(sessionId) { + this.realtimeStreamDisposer?.(); + this.realtimeStreamDisposer = this.plugin.api.openVoiceRealtimeStream(sessionId, { + onEvent: (event, payload) => { + if (event === "transcript.delta" || event === "transcript.done" || event === "ready") { + const transcript = String(payload?.transcript || payload?.text || "").trim(); + if (transcript) { + this.dictationTranscript = transcript; + if (this.dictationInputEl) { + this.dictationInputEl.value = transcript; + } + this.updateDictationSendState(); + } + } + if (event === "error") { + new Notice(String(payload?.message || "Codex voice mode failed.")); + } + if (event === "closed") { + this.isDictating = false; + if (!this.isMicActive) { + this.statusEl?.setText("Ambient mode"); + } + } + }, + onError: (error) => { + new Notice(`Voice transcript stream failed: ${error.message || error}`); + }, + }); + } + + stopDictation(options = {}) { + const stopServer = options.stopServer !== false; + const sessionId = this.realtimeSessionId; + this.realtimeStreamDisposer?.(); + this.realtimeStreamDisposer = null; + this.realtimeSessionId = ""; + this.stopRealtimePeerConnection(); + if (stopServer && sessionId) { + void this.plugin.api.stopVoiceRealtime(sessionId).catch(() => {}); + } + this.isDictating = false; + if (!this.isMicActive) { + this.statusEl?.setText("Ambient mode"); + } + } + + stopRealtimePeerConnection() { + if (this.realtimeDataChannel) { + try { + this.realtimeDataChannel.close(); + } catch { + // Ignore peer cleanup failures. + } + } + if (this.realtimePeerConnection) { + try { + this.realtimePeerConnection.getSenders?.().forEach((sender) => { + try { + this.realtimePeerConnection.removeTrack(sender); + } catch { + // Ignore senders already removed by the runtime. + } + }); + this.realtimePeerConnection.close(); + } catch { + // Ignore peer cleanup failures. + } + } + if (this.realtimeRemoteAudioEl) { + try { + this.realtimeRemoteAudioEl.pause(); + this.realtimeRemoteAudioEl.srcObject = null; + this.realtimeRemoteAudioEl.remove(); + } catch { + // Ignore audio element cleanup failures. + } + } + this.realtimeDataChannel = null; + this.realtimePeerConnection = null; + this.realtimeRemoteAudioEl = null; + } + + updateDictationSendState() { + if (!this.dictationSendButtonEl) { + return; + } + this.dictationSendButtonEl.disabled = this.dictationIsSending || !String(this.dictationTranscript || "").trim(); + this.dictationSendButtonEl.textContent = this.dictationIsSending ? "Sending..." : "Send"; + } + + async sendDictation() { + const message = String(this.dictationTranscript || this.dictationInputEl?.value || "").trim(); + if (!message) { + new Notice("Dictate or type a message first."); + return; + } + this.stopDictation(); + this.dictationIsSending = true; + this.updateDictationSendState(); + try { + const context = this.plugin.getVaultPetQuickChatContext({ preferVaultCanvas: true }); + await this.plugin.startVaultPetChat(context, message); + this.dictationTranscript = ""; + if (this.dictationInputEl) { + this.dictationInputEl.value = ""; + } + this.updateDictationSendState(); + } catch (error) { + new Notice(String(error?.message || error)); + } finally { + this.dictationIsSending = false; + this.updateDictationSendState(); + } + } + + startAnimation() { + if (this.animationFrameId) { + return; + } + const frame = (timestamp) => { + const dt = Math.min(0.05, Math.max(0.001, (timestamp - (this.lastFrameAt || timestamp)) / 1000)); + this.lastFrameAt = timestamp; + this.updateAudio(); + this.stepPhysics(dt, timestamp / 1000); + this.draw(timestamp / 1000); + this.animationFrameId = window.requestAnimationFrame(frame); + }; + this.animationFrameId = window.requestAnimationFrame(frame); + } + + stopAnimation() { + if (this.animationFrameId) { + window.cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = 0; + } + } + + updateAudio() { + if (!this.audioAnalyser || !this.audioData) { + this.audioLevel *= 0.92; + this.frequencyTilt *= 0.9; + return; + } + this.audioAnalyser.getByteFrequencyData(this.audioData); + let sum = 0; + let high = 0; + for (let index = 0; index < this.audioData.length; index += 1) { + const value = this.audioData[index] / 255; + sum += value * value; + if (index > this.audioData.length * 0.45) { + high += value; + } + } + const rms = Math.sqrt(sum / Math.max(1, this.audioData.length)); + const highAverage = high / Math.max(1, this.audioData.length * 0.55); + this.audioLevel = this.audioLevel * 0.72 + rms * 0.28; + this.frequencyTilt = this.frequencyTilt * 0.78 + highAverage * 0.22; + this.volumeEl?.setText(`signal ${Math.round(Math.min(1, this.audioLevel * 3) * 100)}%`); + } + + stepPhysics(dt, time) { + const signal = Math.min(2.2, (this.audioLevel * 5.5 + 0.08) * this.sensitivity); + const repel = 4800 + signal * 8800; + const linkDistance = 70 + signal * 44; + for (let i = 0; i < this.nodes.length; i += 1) { + const a = this.nodes[i]; + for (let j = i + 1; j < this.nodes.length; j += 1) { + const b = this.nodes[j]; + const dx = b.x - a.x; + const dy = b.y - a.y; + const distanceSq = Math.max(80, dx * dx + dy * dy); + const force = repel / distanceSq; + const distance = Math.sqrt(distanceSq); + const fx = (dx / distance) * force; + const fy = (dy / distance) * force; + if (!a.fixed) { + a.vx -= fx * dt; + a.vy -= fy * dt; + } + if (!b.fixed) { + b.vx += fx * dt; + b.vy += fy * dt; + } + } + } + this.edges.forEach((edge) => { + const dx = edge.target.x - edge.source.x; + const dy = edge.target.y - edge.source.y; + const distance = Math.max(1, Math.sqrt(dx * dx + dy * dy)); + const desired = linkDistance + Math.min(45, edge.weight * 5); + const force = (distance - desired) * 0.018; + const fx = (dx / distance) * force; + const fy = (dy / distance) * force; + if (!edge.source.fixed) { + edge.source.vx += fx; + edge.source.vy += fy; + } + if (!edge.target.fixed) { + edge.target.vx -= fx; + edge.target.vy -= fy; + } + }); + this.nodes.forEach((node, index) => { + const centerPull = 0.018; + if (!node.fixed) { + node.vx += -node.x * centerPull * dt; + node.vy += -node.y * centerPull * dt; + const wave = Math.sin(time * (2.2 + this.frequencyTilt * 4) + node.pulse + index * 0.11); + node.vx += Math.cos(node.pulse) * wave * signal * 4.5 * dt; + node.vy += Math.sin(node.pulse) * wave * signal * 4.5 * dt; + node.x += node.vx; + node.y += node.vy; + } + node.vx *= 0.86; + node.vy *= 0.86; + }); + } + + draw(time) { + if (!this.ctx || !this.canvas) { + return; + } + const ratio = window.devicePixelRatio || 1; + const width = this.canvas.width; + const height = this.canvas.height; + const cssWidth = width / ratio; + const cssHeight = height / ratio; + const signal = Math.min(1.2, (this.audioLevel * 3.2 + 0.035) * this.sensitivity); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.clearRect(0, 0, width, height); + this.ctx.fillStyle = getComputedStyle(this.contentEl).getPropertyValue("--background-primary") || "#111"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.setTransform(ratio * this.zoom, 0, 0, ratio * this.zoom, ratio * this.panX, ratio * this.panY); + const styles = getComputedStyle(this.contentEl); + const normalColor = styles.getPropertyValue("--text-normal").trim() || "#d7d7d7"; + const mutedColor = styles.getPropertyValue("--text-muted").trim() || "#9a9a9a"; + const faintColor = styles.getPropertyValue("--background-modifier-border").trim() || "#555"; + + this.edges.forEach((edge) => { + this.ctx.beginPath(); + this.ctx.moveTo(edge.source.x, edge.source.y); + this.ctx.lineTo(edge.target.x, edge.target.y); + this.ctx.globalAlpha = 0.2 + Math.min(0.22, signal * 0.12); + this.ctx.strokeStyle = mutedColor; + this.ctx.lineWidth = Math.min(2, 0.65 + edge.weight * 0.12 + signal * 0.16) / this.zoom; + this.ctx.stroke(); + }); + this.ctx.globalAlpha = 1; + + this.nodes.forEach((node, index) => { + const isHot = node === this.hoveredNode; + const breath = Math.sin(time * 4.5 + node.pulse + index * 0.05) * 0.5 + 0.5; + const reactiveRadius = node.radius + signal * (1.2 + breath * 2.6) + (isHot ? 2.5 : 0); + + this.ctx.beginPath(); + this.ctx.arc(node.x, node.y, reactiveRadius, 0, Math.PI * 2); + this.ctx.fillStyle = isHot ? normalColor : mutedColor; + this.ctx.globalAlpha = isHot ? 0.92 : 0.54 + Math.min(0.12, signal * 0.06); + this.ctx.fill(); + this.ctx.lineWidth = (isHot ? 1.7 : 0.9) / this.zoom; + this.ctx.globalAlpha = isHot ? 0.82 : 0.36; + this.ctx.strokeStyle = normalColor; + this.ctx.stroke(); + this.ctx.globalAlpha = 1; + + if ((isHot || this.zoom > 1.02) && reactiveRadius > 7) { + this.ctx.font = `${Math.max(10, 11 / this.zoom)}px -apple-system, BlinkMacSystemFont, sans-serif`; + this.ctx.globalAlpha = isHot ? 0.88 : 0.48; + this.ctx.fillStyle = isHot ? normalColor : faintColor; + this.ctx.textAlign = "center"; + this.ctx.textBaseline = "top"; + this.ctx.fillText(node.label.slice(0, 34), node.x, node.y + reactiveRadius + 7 / this.zoom); + this.ctx.globalAlpha = 1; + } + }); + + if (this.nodes.length === 0) { + this.ctx.setTransform(ratio, 0, 0, ratio, 0, 0); + this.ctx.fillStyle = "rgba(180, 188, 202, 0.85)"; + this.ctx.font = "14px -apple-system, BlinkMacSystemFont, sans-serif"; + this.ctx.textAlign = "center"; + this.ctx.fillText("No markdown links found yet", cssWidth / 2, cssHeight / 2); + } + } + + getGraphPoint(event) { + const rect = this.canvas.getBoundingClientRect(); + return { + x: (event.clientX - rect.left - this.panX) / this.zoom, + y: (event.clientY - rect.top - this.panY) / this.zoom, + }; + } + + findNodeAt(x, y) { + for (let index = this.nodes.length - 1; index >= 0; index -= 1) { + const node = this.nodes[index]; + const radius = node.radius + Math.max(8, this.audioLevel * 24); + const dx = x - node.x; + const dy = y - node.y; + if (dx * dx + dy * dy <= radius * radius) { + return node; + } + } + return null; + } +} + +class OpenAgentView extends ItemView { + constructor(leaf, plugin) { + super(leaf); + this.plugin = plugin; + this.cwdInput = null; + this.composerInput = null; + this.panelScrollEl = null; + this.panelScrollKey = ""; + this.expandedToolMessages = new Set(); + this.visibleMessageCountByTask = new Map(); + this.visibleSettingsTaskCountByKey = new Map(); + this.settingsTaskTab = "all"; + this.lastRenderedActiveTaskId = null; + this.pendingInitialPanelScrollKey = ""; + this.lastRenderedTaskMessageStateByTask = new Map(); + this.activeSelectableMessageEl = null; + this.isClampingMessageSelection = false; + this.taskListHovered = false; + this.renderedActiveTaskId = ""; + this.activeTaskStatusEl = null; + this.messagesSectionEl = null; + } + + getViewType() { + return VIEW_TYPE; + } + + getDisplayText() { + return "OpenAgent"; + } + + getIcon() { + return "bot"; + } + + async onOpen() { + const document = this.containerEl?.ownerDocument; + if (document) { + this.registerDomEvent(document, "selectionchange", () => this.handleMessageSelectionChange()); + this.registerDomEvent(document, "mouseup", () => this.clearActiveMessageSelection()); + this.registerDomEvent(document, "pointerup", () => this.clearActiveMessageSelection()); + } + await this.plugin.refreshTasks(); + this.render(); + } + + clearActiveMessageSelection() { + this.activeSelectableMessageEl = null; + } + + bindMessageSelectionGuard(messageTextEl) { + if (!messageTextEl) { + return; + } + + const activateMessageSelection = (event) => { + if (event && typeof event.button === "number" && event.button !== 0) { + return; + } + this.activeSelectableMessageEl = messageTextEl; + }; + + messageTextEl.addEventListener("mousedown", activateMessageSelection); + messageTextEl.addEventListener("pointerdown", activateMessageSelection); + } + + bindTaskListHoverGuard(taskListEl) { + if (!taskListEl) { + return; + } + + taskListEl.addEventListener("mouseenter", () => { + this.taskListHovered = true; + this.plugin.setTaskListHovered(true); + }); + taskListEl.addEventListener("mouseleave", () => { + this.taskListHovered = false; + this.plugin.setTaskListHovered(false); + }); + } + + hasHoveredTaskList() { + return this.taskListHovered === true; + } + + handleMessageSelectionChange() { + if (this.isClampingMessageSelection) { + return; + } + + const messageTextEl = this.activeSelectableMessageEl; + if (!messageTextEl || !messageTextEl.isConnected) { + this.activeSelectableMessageEl = null; + return; + } + + const document = messageTextEl.ownerDocument; + const selection = document?.getSelection?.(); + if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { + return; + } + + const range = selection.getRangeAt(0); + const startInside = messageTextEl.contains(range.startContainer); + const endInside = messageTextEl.contains(range.endContainer); + if (startInside && endInside) { + return; + } + + if (!range.intersectsNode(messageTextEl)) { + return; + } + + const clampedRange = range.cloneRange(); + if (!startInside) { + clampedRange.setStart(messageTextEl, 0); + } + if (!endInside) { + clampedRange.setEnd(messageTextEl, messageTextEl.childNodes.length); + } + + this.isClampingMessageSelection = true; + try { + selection.removeAllRanges(); + selection.addRange(clampedRange); + } finally { + this.isClampingMessageSelection = false; + } + } + + captureComposerFocusState() { + const input = this.composerInput; + if (!input) { + return null; + } + + const activeElement = input.ownerDocument?.activeElement; + if (activeElement !== input) { + return null; + } + + return { + taskId: String(input.dataset.taskId || ""), + selectionStart: typeof input.selectionStart === "number" ? input.selectionStart : null, + selectionEnd: typeof input.selectionEnd === "number" ? input.selectionEnd : null, + selectionDirection: input.selectionDirection || "none", + scrollTop: input.scrollTop || 0, + }; + } + + restoreComposerFocusState(focusState) { + if (!focusState || !this.composerInput) { + return; + } + + if (String(this.composerInput.dataset.taskId || "") !== String(focusState.taskId || "")) { + return; + } + + window.requestAnimationFrame(() => { + if (!this.composerInput) { + return; + } + + this.composerInput.focus(); + if (typeof focusState.selectionStart === "number" && typeof focusState.selectionEnd === "number") { + try { + this.composerInput.setSelectionRange( + focusState.selectionStart, + focusState.selectionEnd, + focusState.selectionDirection + ); + } catch { + // Ignore selection restore failures on detached or unsupported inputs. + } + } + this.composerInput.scrollTop = Number(focusState.scrollTop || 0); + }); + } + + capturePanelScrollState() { + const scrollEl = this.panelScrollEl; + if (!scrollEl) { + return null; + } + + const maxScrollTop = Math.max(0, scrollEl.scrollHeight - scrollEl.clientHeight); + const scrollTop = Number(scrollEl.scrollTop || 0); + const distanceFromBottom = Math.max(0, maxScrollTop - scrollTop); + return { + key: this.panelScrollKey, + scrollTop, + atBottom: distanceFromBottom <= 32, + }; + } + + restorePanelScrollState(scrollState, nextKey) { + if (!scrollState || scrollState.key !== nextKey) { + return; + } + + window.requestAnimationFrame(() => { + const scrollEl = this.panelScrollEl; + if (!scrollEl || this.panelScrollKey !== nextKey) { + return; + } + + const maxScrollTop = Math.max(0, scrollEl.scrollHeight - scrollEl.clientHeight); + scrollEl.scrollTop = scrollState.atBottom + ? maxScrollTop + : Math.min(Number(scrollState.scrollTop || 0), maxScrollTop); + }); + } + + getLatestMessageState(task) { + const taskId = String(task?.taskId || ""); + const messages = Array.isArray(task?.messages) ? task.messages : []; + if (!taskId || messages.length === 0) { + return { + taskId, + count: messages.length, + lastIdentity: "", + lastRole: "", + }; + } + + const lastIndex = messages.length - 1; + const lastMessage = messages[lastIndex]; + return { + taskId, + count: messages.length, + lastIdentity: this.getMessageIdentity(lastMessage, lastIndex), + lastRole: String(lastMessage?.role || ""), + }; + } + + shouldAutoScrollToLatestUserMessage(task, options = {}) { + if (options.didSwitchActiveTask === true) { + return false; + } + + const nextState = this.getLatestMessageState(task); + if (!nextState.taskId || nextState.count === 0 || nextState.lastRole !== "user") { + return false; + } + + const previousState = this.lastRenderedTaskMessageStateByTask.get(nextState.taskId); + if (!previousState) { + return false; + } + + return ( + nextState.count > previousState.count + || nextState.lastIdentity !== previousState.lastIdentity + ); + } + + rememberRenderedTaskMessageState(task) { + const state = this.getLatestMessageState(task); + if (!state.taskId) { + return; + } + + this.lastRenderedTaskMessageStateByTask.set(state.taskId, state); + } + + scrollMessageIntoView(messageEl, nextKey) { + if (!messageEl) { + return; + } + + window.requestAnimationFrame(() => { + const scrollEl = this.panelScrollEl; + if (!scrollEl || this.panelScrollKey !== nextKey || !messageEl.isConnected) { + return; + } + + messageEl.scrollIntoView({ + block: "end", + inline: "nearest", + }); + }); + } + + queueInitialPanelScroll(nextKey) { + this.pendingInitialPanelScrollKey = String(nextKey || "").trim(); + } + + shouldInitialScrollToConversationEnd(nextKey) { + return String(nextKey || "").trim() !== "" + && this.pendingInitialPanelScrollKey === String(nextKey || "").trim(); + } + + consumeInitialPanelScroll(nextKey) { + if (this.pendingInitialPanelScrollKey === String(nextKey || "").trim()) { + this.pendingInitialPanelScrollKey = ""; + } + } + + hasFocusedComposer() { + const input = this.composerInput; + return Boolean(input && input.ownerDocument?.activeElement === input); + } + + getMessageIdentity(message, index) { + return String( + message?.id + || message?.streamKey + || `${message?.role || "system"}:${message?.kind || ""}:${message?.turnId || ""}:${message?.itemId || ""}:${index}` + ); + } + + isToolMessage(message) { + return String(message?.kind || "").trim() === "tool"; + } + + getToolMessagePreview(text) { + const compact = String(text || "").replace(/\s+/g, " ").trim(); + return compact || "Tool output"; + } + + resetActiveTaskDomRefs() { + this.renderedActiveTaskId = ""; + this.activeTaskStatusEl = null; + this.messagesSectionEl = null; + } + + updateActiveTaskStatus(task) { + if (!this.activeTaskStatusEl?.isConnected) { + return; + } + + const status = String(task?.status || "idle"); + this.activeTaskStatusEl.className = `oa-status-tag${["running", "starting"].includes(status) ? " is-running" : ""}`; + this.activeTaskStatusEl.setText(status); + } + + renderTaskMessages(messagesSection, activeTask, options = {}) { + if (!messagesSection) { + return; + } + + const panelScrollState = options.panelScrollState || null; + const panelScrollKey = String(options.panelScrollKey || this.panelScrollKey || ""); + const didSwitchActiveTask = options.didSwitchActiveTask === true; + const shouldAutoScrollToLatestUserMessage = this.shouldAutoScrollToLatestUserMessage(activeTask, { + didSwitchActiveTask, + }); + + messagesSection.empty(); + const messages = Array.isArray(activeTask?.messages) ? activeTask.messages : []; + const messagesLoaded = this.plugin.taskHasLoadedMessages(activeTask); + const messageCount = Math.max(Number(activeTask?.messageCount) || 0, messages.length); + const renderSelectionImageBubble = () => { + const messageList = messagesSection.createDiv({ cls: "oa-message-list" }); + this.plugin.renderSelectionImageMessage(messageList, activeTask?.selectionContext); + return messageList; + }; + + if (!messagesLoaded && messageCount > 0) { + renderSelectionImageBubble(); + messagesSection.createDiv({ + cls: "oa-muted", + text: `Loading conversation (${messageCount} messages)...`, + }); + this.restorePanelScrollState(panelScrollState, panelScrollKey); + this.rememberRenderedTaskMessageState(activeTask); + return; + } + + if (messages.length === 0) { + renderSelectionImageBubble(); + messagesSection.createDiv({ cls: "oa-muted", text: "No conversation yet." }); + this.restorePanelScrollState(panelScrollState, panelScrollKey); + this.rememberRenderedTaskMessageState(activeTask); + return; + } + + const visibleMessageCount = this.syncVisibleMessageCount(activeTask.taskId, messages.length, { + reset: didSwitchActiveTask, + }); + const firstVisibleIndex = Math.max(0, messages.length - visibleMessageCount); + const hiddenMessageCount = firstVisibleIndex; + const shouldInitialScrollToConversationEnd = this.shouldInitialScrollToConversationEnd(panelScrollKey); + let latestMessageEl = null; + let latestUserMessageEl = null; + + if (hiddenMessageCount > 0) { + const pagination = messagesSection.createDiv({ cls: "oa-message-pagination" }); + pagination.createDiv({ + cls: "oa-message-pagination-summary", + text: `Showing ${visibleMessageCount} latest of ${messages.length} messages.`, + }); + const paginationActions = pagination.createDiv({ cls: "oa-action-row oa-message-pagination-actions" }); + const nextVisibleCount = Math.min(messages.length, visibleMessageCount + CHAT_MESSAGE_PAGE_SIZE); + const loadCount = nextVisibleCount - visibleMessageCount; + this.makeButton( + paginationActions, + `Show ${loadCount} earlier`, + () => this.showOlderMessages(activeTask.taskId, messages.length), + false, + { runOnMouseDown: true } + ); + } + + const messageList = renderSelectionImageBubble(); + messages.slice(firstVisibleIndex).forEach((message, index) => { + const messageIndex = firstVisibleIndex + index; + const isToolMessage = this.isToolMessage(message); + const item = messageList.createDiv({ + cls: `oa-message oa-chat-message oa-role-${message.role || "system"}${isToolMessage ? " oa-message-tool" : ""}`, + }); + latestMessageEl = item; + if (isToolMessage) { + const messageKey = this.getMessageIdentity(message, messageIndex); + const expanded = this.expandedToolMessages.has(messageKey); + item.toggleClass("is-expanded", expanded); + item.toggleClass("is-collapsed", !expanded); + + const toggle = item.createEl("button", { + cls: "oa-message-toggle", + attr: { + type: "button", + "aria-expanded": expanded ? "true" : "false", + }, + }); + const toggleText = toggle.createDiv({ cls: "oa-message-toggle-text" }); + toggleText.createDiv({ + cls: "oa-message-preview", + text: this.getToolMessagePreview(message.text), + }); + toggle.createDiv({ + cls: "oa-message-toggle-icon", + text: expanded ? "-" : "+", + }); + + const body = item.createDiv({ + cls: "oa-message-text", + text: message.text || "", + }); + this.bindMessageSelectionGuard(body); + body.toggleClass("is-hidden", !expanded); + + toggle.addEventListener("click", () => { + if (this.expandedToolMessages.has(messageKey)) { + this.expandedToolMessages.delete(messageKey); + item.removeClass("is-expanded"); + item.addClass("is-collapsed"); + toggle.setAttribute("aria-expanded", "false"); + body.addClass("is-hidden"); + const icon = toggle.querySelector(".oa-message-toggle-icon"); + if (icon) { + icon.textContent = "+"; + } + return; + } + + this.expandedToolMessages.add(messageKey); + item.removeClass("is-collapsed"); + item.addClass("is-expanded"); + toggle.setAttribute("aria-expanded", "true"); + body.removeClass("is-hidden"); + const icon = toggle.querySelector(".oa-message-toggle-icon"); + if (icon) { + icon.textContent = "-"; + } + }); + return; + } + + const body = item.createDiv({ + cls: "oa-message-text", + text: message.text || "", + }); + this.bindMessageSelectionGuard(body); + if (messageIndex === messages.length - 1 && String(message.role || "") === "user") { + latestUserMessageEl = item; + } + }); + + if (shouldInitialScrollToConversationEnd && latestMessageEl) { + this.consumeInitialPanelScroll(panelScrollKey); + this.scrollMessageIntoView(latestMessageEl, panelScrollKey); + } else if (shouldAutoScrollToLatestUserMessage && latestUserMessageEl) { + this.scrollMessageIntoView(latestUserMessageEl, panelScrollKey); + } else { + this.restorePanelScrollState(panelScrollState, panelScrollKey); + } + + this.rememberRenderedTaskMessageState(activeTask); + } + + tryApplyStreamingTaskUpdate(task) { + const normalizedTaskId = String(task?.taskId || "").trim(); + if (!normalizedTaskId) { + return false; + } + + if (this.plugin.getPanelTab() !== PANEL_TAB_OPTIONS.TASK_LIST) { + return false; + } + + const activeTask = this.plugin.getActiveTask(); + if (normalizedTaskId !== String(activeTask?.taskId || "").trim()) { + return false; + } + + if (normalizedTaskId !== String(this.renderedActiveTaskId || "").trim()) { + return false; + } + + if (!this.messagesSectionEl?.isConnected || !this.activeTaskStatusEl?.isConnected) { + return false; + } + + if (!this.plugin.isTaskRunning(task) || String(task?.lastError || "").trim()) { + return false; + } + + const panelScrollState = this.capturePanelScrollState(); + this.updateActiveTaskStatus(task); + this.renderTaskMessages(this.messagesSectionEl, task, { + panelScrollState, + panelScrollKey: this.panelScrollKey, + }); + return true; + } + + getDefaultVisibleMessageCount(totalMessages) { + return Math.min(Math.max(Number(totalMessages) || 0, 0), CHAT_MESSAGE_PAGE_SIZE); + } + + syncVisibleMessageCount(taskId, totalMessages, options = {}) { + const normalizedTaskId = String(taskId || ""); + const normalizedTotal = Math.max(Number(totalMessages) || 0, 0); + if (!normalizedTaskId) { + return this.getDefaultVisibleMessageCount(normalizedTotal); + } + + const defaultCount = this.getDefaultVisibleMessageCount(normalizedTotal); + const currentCount = this.visibleMessageCountByTask.get(normalizedTaskId); + if (options.reset === true || typeof currentCount !== "number" || currentCount <= 0) { + this.visibleMessageCountByTask.set(normalizedTaskId, defaultCount); + return defaultCount; + } + + const nextCount = Math.max(defaultCount, Math.min(currentCount, normalizedTotal)); + this.visibleMessageCountByTask.set(normalizedTaskId, nextCount); + return nextCount; + } + + showOlderMessages(taskId, totalMessages) { + const normalizedTaskId = String(taskId || ""); + if (!normalizedTaskId) { + return; + } + + const currentCount = this.syncVisibleMessageCount(normalizedTaskId, totalMessages); + const nextCount = Math.min(Math.max(Number(totalMessages) || 0, 0), currentCount + CHAT_MESSAGE_PAGE_SIZE); + if (nextCount === currentCount) { + return; + } + + this.visibleMessageCountByTask.set(normalizedTaskId, nextCount); + this.render(); + } + + getDefaultVisibleSettingsTaskCount(totalTasks) { + return Math.min(Math.max(Number(totalTasks) || 0, 0), SETTINGS_RECENT_TASKS_PAGE_SIZE); + } + + syncVisibleSettingsTaskCount(listKey, totalTasks, options = {}) { + const normalizedKey = String(listKey || ""); + const normalizedTotal = Math.max(Number(totalTasks) || 0, 0); + if (!normalizedKey) { + return this.getDefaultVisibleSettingsTaskCount(normalizedTotal); + } + + const defaultCount = this.getDefaultVisibleSettingsTaskCount(normalizedTotal); + const currentCount = this.visibleSettingsTaskCountByKey.get(normalizedKey); + if (options.reset === true || typeof currentCount !== "number" || currentCount <= 0) { + this.visibleSettingsTaskCountByKey.set(normalizedKey, defaultCount); + return defaultCount; + } + + const nextCount = Math.max(defaultCount, Math.min(currentCount, normalizedTotal)); + this.visibleSettingsTaskCountByKey.set(normalizedKey, nextCount); + return nextCount; + } + + showMoreSettingsTasks(listKey, totalTasks) { + const normalizedKey = String(listKey || ""); + if (!normalizedKey) { + return; + } + + const currentCount = this.syncVisibleSettingsTaskCount(normalizedKey, totalTasks); + const nextCount = Math.min(Math.max(Number(totalTasks) || 0, 0), currentCount + SETTINGS_RECENT_TASKS_PAGE_SIZE); + if (nextCount === currentCount) { + return; + } + + this.visibleSettingsTaskCountByKey.set(normalizedKey, nextCount); + this.render(); + } + + getSettingsTaskTab() { + if (this.settingsTaskTab === "archived") { + return "archived"; + } + + if (this.settingsTaskTab === "running") { + return "running"; + } + + return this.settingsTaskTab === "recent" ? "recent" : "all"; + } + + setSettingsTaskTab(tab) { + const nextTab = tab === "archived" + ? "archived" + : (tab === "running" + ? "running" + : (tab === "recent" ? "recent" : "all")); + if (this.settingsTaskTab === nextTab) { + return; + } + + this.settingsTaskTab = nextTab; + this.render(); + } + + getSettingsTaskTabLabel(tab = this.getSettingsTaskTab()) { + if (tab === "archived") { + return "Archived threads"; + } + if (tab === "running") { + return "Running threads"; + } + if (tab === "recent") { + return "Recent threads"; + } + return "All threads"; + } + + bindImmediateMouseAction(element, callback) { + if (!element || typeof callback !== "function") { + return; + } + + let ignoreNextClick = false; + element.addEventListener("mousedown", (event) => { + if (event.button !== 0 || element.disabled) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + ignoreNextClick = true; + callback(event); + }); + element.addEventListener("click", (event) => { + if (ignoreNextClick) { + event.preventDefault(); + event.stopPropagation(); + ignoreNextClick = false; + return; + } + + callback(event); + }); + } + + renderPanelTabs(parentEl, activePanelTab) { + const tabs = parentEl.createDiv({ cls: "oa-panel-tabs" }); + [ + { id: PANEL_TAB_OPTIONS.TASK_LIST, label: "Threads" }, + { id: PANEL_TAB_OPTIONS.HEARTBEAT, label: "Heart beat" }, + { id: PANEL_TAB_OPTIONS.WORKSPACE, label: "Workspace" }, + ].forEach((tab) => { + const isActive = activePanelTab === tab.id; + const button = tabs.createEl("button", { + cls: `oa-panel-tab${isActive ? " is-active" : ""}`, + text: tab.label, + attr: { + type: "button", + "aria-pressed": isActive ? "true" : "false", + }, + }); + this.bindImmediateMouseAction(button, () => { + if (tab.id === PANEL_TAB_OPTIONS.TASK_LIST) { + void this.plugin.setTaskDetailOpen(false); + return; + } + void this.plugin.setPanelTab(tab.id); + }); + }); + } + + renderThreadsPanel(parentEl, context = {}) { + const { + activeCanvasPath = "", + activeWorkspace = null, + activeTask = null, + archivedTasks = [], + runningTasks = [], + tasks = [], + } = context; + const threadsBlock = parentEl.createDiv({ cls: "oa-settings-section-block" }); + const threadsHeader = threadsBlock.createDiv({ cls: "oa-settings-section-header oa-thread-filter-header" }); + const settingsTaskTab = this.getSettingsTaskTab(); + threadsHeader.createEl("h3", { + cls: "oa-settings-section-title", + text: activeCanvasPath ? this.getSettingsTaskTabLabel(settingsTaskTab) : "Tasks", + }); + const filterShell = threadsHeader.createDiv({ cls: "oa-thread-filter-shell" }); + const filterSelect = filterShell.createEl("select", { + cls: "oa-thread-filter-select", + attr: { + "aria-label": "Thread filter", + }, + }); + [ + { id: "all", label: "All threads" }, + { id: "recent", label: "Recent threads" }, + { id: "running", label: "Running threads" }, + { id: "archived", label: "Archived threads" }, + ].forEach((tab) => { + filterSelect.createEl("option", { + text: tab.label, + value: tab.id, + }); + }); + filterSelect.value = settingsTaskTab; + filterSelect.addEventListener("mousedown", (event) => { + event.stopPropagation(); + filterSelect.focus(); + }); + filterSelect.addEventListener("change", () => this.setSettingsTaskTab(filterSelect.value)); + + const threadSection = threadsBlock.createDiv({ cls: "oa-task-section oa-settings-task-section" }); + const allTasks = this.plugin.getTasks(); + const displayedTasks = settingsTaskTab === "all" + ? allTasks + : (settingsTaskTab === "archived" + ? archivedTasks + : (settingsTaskTab === "running" ? runningTasks : tasks)); + const taskListKey = [ + "panel-threads", + settingsTaskTab, + settingsTaskTab === "all" ? "all" : (activeCanvasPath || ""), + settingsTaskTab === "all" ? "" : (activeWorkspace?.repoPath || ""), + ].join(":"); + this.renderTaskList(threadSection, displayedTasks, { + emptyText: settingsTaskTab === "archived" + ? (activeCanvasPath + ? "No archived thread yet for this canvas." + : "No archived task yet.") + : (settingsTaskTab === "all" + ? "No OpenAgent threads yet." + : (settingsTaskTab === "running" + ? (activeCanvasPath + ? "No running thread for this canvas." + : "No running task right now.") + : (activeCanvasPath + ? "No thread yet for this canvas. Select a node and start one." + : "Open a Canvas and select a text node to work with its thread."))), + listKey: taskListKey, + activeTask, + }); + } + + renderHeartbeatPanel(parentEl) { + const block = parentEl.createDiv({ cls: "oa-settings-section-block" }); + block.createEl("h3", { + cls: "oa-settings-section-title", + text: "Automations", + }); + const section = block.createDiv({ cls: "oa-settings-section" }); + const automationFiles = this.plugin.getAutomationFiles(); + const list = section.createDiv({ cls: "oa-settings-list" }); + if (automationFiles.length === 0) { + list.createDiv({ + cls: "oa-muted", + text: "No automation files found.", + }); + } else { + automationFiles.forEach((file) => { + const row = list.createDiv({ cls: "oa-settings-row" }); + row.createDiv({ cls: "oa-settings-label", text: basenameVaultPath(file.path).replace(/\.md$/i, "") }); + const value = row.createDiv({ cls: "oa-settings-value oa-settings-value-stack" }); + value.createDiv({ cls: "oa-settings-value-path", text: file.path, attr: { title: file.path } }); + }); + } + + const actions = section.createDiv({ cls: "oa-action-row oa-settings-actions" }); + this.makeButton(actions, "Sync automations", () => { + void this.plugin.syncAutomationsWithFeedback(); + }, false, { runOnMouseDown: true }); + this.makeButton(actions, "Run daily review", () => { + void this.plugin.runAutomationWithFeedback("daily-vault-review"); + }, false, { runOnMouseDown: true }); + } + + renderWorkspacePanel(parentEl, context = {}) { + const { activeWorkspace = null, workspaceSummariesLoading = false } = context; + const workspaceBlock = parentEl.createDiv({ cls: "oa-settings-section-block" }); + workspaceBlock.createEl("h3", { + cls: "oa-settings-section-title", + text: "Workspace", + }); + const workspaceSection = workspaceBlock.createDiv({ + cls: "oa-settings-section oa-workspace-settings-section", + }); + const workspaceSummary = workspaceSection.createDiv({ cls: "oa-settings-list" }); + const repoPath = activeWorkspace?.repoPath || ""; + const projectConfigPath = repoPath ? path.join(repoPath, REPO_WORKSPACE_DIR_NAME, WORKSPACE_CONFIG_FILE_NAME) : ""; + const agentsPath = repoPath ? path.join(repoPath, "AGENTS.md") : ""; + [ + { + label: "Current workspace", + value: repoPath || (workspaceSummariesLoading ? "Loading workspace..." : "No workspace selected"), + title: repoPath, + }, + { + label: "Vault config", + value: activeWorkspace?.configPath || "Missing", + title: activeWorkspace?.configPath || "", + }, + { + label: "Project config", + value: projectConfigPath + ? (fs.existsSync(projectConfigPath) ? `Found: ${projectConfigPath}` : `Missing: ${projectConfigPath}`) + : "No workspace selected", + title: projectConfigPath, + }, + { + label: "AGENTS.md", + value: agentsPath + ? (fs.existsSync(agentsPath) ? agentsPath : `Missing: ${agentsPath}`) + : "No workspace selected", + title: agentsPath, + }, + ].forEach((item) => { + const row = workspaceSummary.createDiv({ cls: "oa-settings-row" }); + row.createDiv({ cls: "oa-settings-label", text: item.label }); + row.createDiv({ + cls: "oa-settings-value oa-settings-value-path", + text: item.value, + attr: item.title ? { title: item.title } : {}, + }); + }); + + const workspaceActions = workspaceSection.createDiv({ cls: "oa-action-row oa-settings-actions" }); + const chooseWorkspaceButton = this.makeButton(workspaceActions, "New workspace", () => this.plugin.showWorkspacePicker()); + chooseWorkspaceButton.setCta(); + if (activeWorkspace?.configPath) { + this.makeButton(workspaceActions, "Open workspace.json", () => { + void this.plugin.app.workspace.openLinkText(activeWorkspace.configPath, "", false); + }); + } + if (agentsPath && fs.existsSync(agentsPath)) { + this.makeButton(workspaceActions, "Open AGENTS.md", () => { + window.open(pathToFileURL(agentsPath).href); + }); + } + + const daemonBlock = parentEl.createDiv({ cls: "oa-settings-section-block" }); + daemonBlock.createEl("h3", { + cls: "oa-settings-section-title", + text: "Codex server", + }); + const daemonSection = daemonBlock.createDiv({ cls: "oa-settings-section oa-settings-summary" }); + const daemonSummary = daemonSection.createDiv({ cls: "oa-settings-list" }); + const daemonRow = daemonSummary.createDiv({ cls: "oa-settings-row" }); + daemonRow.createDiv({ cls: "oa-settings-label", text: "Connection" }); + const daemonValue = daemonRow.createDiv({ cls: "oa-settings-value oa-settings-value-stack" }); + daemonValue.createDiv({ + cls: `oa-status-tag ${this.plugin.getDaemonStatusTagClassName()}`.trim(), + text: this.plugin.getDaemonStatusLabel(), + }); + daemonValue.createDiv({ + cls: "oa-task-meta", + text: this.plugin.getDaemonStatusDetail() || "Checks whether the local Codex server is reachable.", + }); + + const daemonActions = daemonSection.createDiv({ cls: "oa-action-row oa-settings-actions" }); + this.makeButton(daemonActions, "Refresh", () => { + void this.plugin.refreshDaemonStatus({ + silent: false, + forceRefresh: true, + }); + }, false, { + runOnMouseDown: true, + }); + if (this.plugin.getDaemonStatus().state !== DAEMON_CONNECTION_STATES.ONLINE) { + this.makeButton(daemonActions, "Start server", () => { + void this.plugin.startDaemonWithFeedback(); + }, false, { + runOnMouseDown: true, + }); + } + } + + renderTaskList(parentEl, tasks, options = {}) { + if (!parentEl) { + return; + } + + const title = String(options.title || "").trim(); + if (title) { + parentEl.createEl("h3", { text: title }); + } + + const displayedTasks = Array.isArray(tasks) ? tasks : []; + const listEl = parentEl.createDiv({ cls: "oa-task-list" }); + this.bindTaskListHoverGuard(listEl); + if (displayedTasks.length === 0) { + listEl.createDiv({ + cls: "oa-muted", + text: String(options.emptyText || "No threads yet."), + }); + return; + } + + const listKey = String(options.listKey || "").trim(); + const visibleTaskCount = options.enablePagination === false + ? displayedTasks.length + : this.syncVisibleSettingsTaskCount(listKey, displayedTasks.length, { + reset: options.resetPagination === true, + }); + const onTaskClick = typeof options.onTaskClick === "function" + ? options.onTaskClick + : ((task) => this.plugin.activateTaskFromList(task.taskId)); + const visibleTasks = displayedTasks.slice(0, visibleTaskCount); + let previousDayKey = ""; + + visibleTasks.forEach((task) => { + const dayTimestamp = this.plugin.getTaskConversationLastMessageDayTimestamp(task); + const dayKey = Number.isFinite(dayTimestamp) ? String(dayTimestamp) : "unknown"; + if (dayKey !== previousDayKey) { + previousDayKey = dayKey; + listEl.createEl("h4", { + cls: "oa-task-list-date-heading", + text: formatTaskListDayLabel(dayTimestamp), + }); + } + + const isRunningTask = this.plugin.isTaskRunning(task); + const item = listEl.createDiv({ + cls: `oa-task-item oa-thread-list-item${options.activeTask?.taskId === task.taskId ? " is-active" : ""}${isRunningTask ? " is-running" : ""}`, + }); + const itemHeader = item.createDiv({ cls: "oa-task-item-header" }); + const itemMain = itemHeader.createDiv({ cls: "oa-thread-list-main" }); + itemMain.createDiv({ cls: "oa-task-title oa-thread-list-title", text: task.title || "Untitled task" }); + const metaParts = []; + const projectLabel = this.plugin.getTaskProjectLabel(task); + if (projectLabel) { + metaParts.push(projectLabel); + } + const conversationTimestamp = this.plugin.getTaskConversationLastMessageTimestamp(task); + const conversationTimeLabel = formatTaskListTimeLabel(conversationTimestamp); + if (conversationTimeLabel) { + metaParts.push(conversationTimeLabel); + } + if (metaParts.length > 0) { + itemMain.createDiv({ + cls: "oa-thread-list-meta", + text: metaParts.join(" • "), + }); + } + if (this.plugin.hasUnreadTask(task.taskId)) { + itemHeader.createDiv({ + cls: "oa-thread-list-unread-dot", + attr: { + "aria-label": "Unread result", + title: "Unread result", + }, + }); + } else { + const detailButton = itemHeader.createEl("button", { + cls: "oa-thread-list-arrow", + text: "→", + attr: { + type: "button", + "aria-label": "Show detail", + title: "Show detail", + }, + }); + this.bindImmediateMouseAction(detailButton, () => { + void this.plugin.activateTaskFromList(task.taskId, { + showDetail: true, + }); + }); + } + + this.bindImmediateMouseAction(item, () => { + void onTaskClick(task); + }); + }); + + if (options.enablePagination === false || displayedTasks.length <= visibleTaskCount) { + return; + } + + const moreActions = parentEl.createDiv({ cls: "oa-action-row" }); + this.makeButton( + moreActions, + `Show more (${displayedTasks.length - visibleTaskCount} left)`, + () => this.showMoreSettingsTasks(listKey, displayedTasks.length), + false, + { runOnMouseDown: true } + ); + } + + renderGroupContextPreview(parentEl, preview) { + if (!parentEl || !preview) { + return; + } + + const isLoading = preview.status === "loading"; + const textCount = Array.isArray(preview.textBlocks) ? preview.textBlocks.length : 0; + const fileCount = Array.isArray(preview.markdownFiles) ? preview.markdownFiles.length : 0; + const summaryText = isLoading + ? `Loading group context from ${preview.canvasPath}...` + : fileCount > 0 + ? `${fileCount} markdown file${fileCount === 1 ? "" : "s"} in ${preview.canvasPath}` + : `No markdown file context found in ${preview.canvasPath}`; + + const card = parentEl.createDiv({ cls: "oa-task-item oa-group-context-card" }); + const cardHeader = card.createDiv({ cls: "oa-task-item-header" }); + cardHeader.createDiv({ + cls: "oa-task-title", + text: `Group context: ${preview.groupLabel || "Untitled group"}`, + }); + cardHeader.createDiv({ + cls: "oa-status-tag", + text: isLoading ? "Loading" : "Preview", + }); + + card.createDiv({ + cls: "oa-task-meta", + text: summaryText, + attr: { title: preview.canvasPath }, + }); + + const list = card.createDiv({ cls: "oa-group-context-list" }); + (preview.markdownFiles || []).slice(0, 4).forEach((file, index) => { + const item = list.createDiv({ cls: "oa-group-context-item" }); + item.createDiv({ cls: "oa-group-context-label", text: `Markdown ${index + 1}` }); + item.createDiv({ + cls: "oa-group-context-value", + text: String(file?.path || file?.name || "Untitled"), + attr: file?.path ? { title: file.path } : {}, + }); + }); + if (isLoading && fileCount === 0) { + list.createDiv({ + cls: "oa-muted", + text: "Resolving markdown files in this group...", + }); + } + if ((preview.markdownFiles || []).length > 4) { + list.createDiv({ + cls: "oa-muted", + text: `And ${(preview.markdownFiles || []).length - 4} more markdown file${(preview.markdownFiles || []).length - 4 === 1 ? "" : "s"}.`, + }); + } + + if (fileCount === 0 && textCount > 0) { + list.createDiv({ + cls: "oa-muted", + text: "This group has text nodes, but only markdown file nodes become default context.", + }); + } + + if (Array.isArray(preview.warnings) && preview.warnings.length > 0) { + preview.warnings.forEach((warning) => { + card.createDiv({ cls: "oa-banner oa-banner-warning", text: warning }); + }); + } + + card.createDiv({ + cls: "oa-muted", + text: "Select a text node inside this group to start a new thread with this group context.", + }); + } + + render() { + const composerFocusState = this.captureComposerFocusState(); + const panelScrollState = this.capturePanelScrollState(); + const { contentEl: rootEl } = this; + rootEl.empty(); + this.resetActiveTaskDomRefs(); + rootEl.addClass("openagent-view"); + const activeCanvasPath = this.plugin.getActiveCanvasPath(); + const activeWorkspace = this.plugin.getActiveWorkspace(); + const tasks = this.plugin.getVisibleTasks(); + const archivedTasks = this.plugin.getArchivedTasks(); + const runningTasks = this.plugin.getRunningTasks(); + const activeTask = this.plugin.getActiveTask(); + const selectedGroupContextPreview = this.plugin.getSelectedGroupContextPreview(); + const workspaceSummariesLoading = this.plugin.isWorkspaceSummariesLoading(); + const activeTaskId = activeTask?.taskId ? String(activeTask.taskId) : ""; + const didSwitchActiveTask = Boolean(activeTaskId && activeTaskId !== this.lastRenderedActiveTaskId); + const shouldAutoScrollToLatestUserMessage = this.shouldAutoScrollToLatestUserMessage(activeTask, { + didSwitchActiveTask, + }); + this.lastRenderedActiveTaskId = activeTaskId || null; + const panelTab = this.plugin.getPanelTab(); + const taskDetailOpen = panelTab === PANEL_TAB_OPTIONS.TASK_LIST && this.plugin.isTaskDetailOpen(); + const isUtilityTab = panelTab !== PANEL_TAB_OPTIONS.TASK_LIST; + const contentEl = rootEl.createDiv({ cls: `oa-panel-scroll${isUtilityTab ? " is-settings-screen" : ""}` }); + this.panelScrollEl = contentEl; + this.cwdInput = null; + this.composerInput = null; + const activeTaskArchived = activeTask ? this.plugin.isTaskArchived(activeTask) : false; + const panelScrollKey = [ + panelTab, + activeCanvasPath || "", + panelTab === PANEL_TAB_OPTIONS.TASK_LIST ? (activeTask?.taskId || "") : "", + ].join(":"); + this.panelScrollKey = panelScrollKey; + if (panelTab === PANEL_TAB_OPTIONS.TASK_LIST && activeTaskId && didSwitchActiveTask) { + this.queueInitialPanelScroll(panelScrollKey); + } + + const header = contentEl.createDiv({ cls: "oa-header" }); + const headerTop = header.createDiv({ cls: "oa-header-top" }); + const brand = headerTop.createDiv({ cls: "oa-brand" }); + const logo = brand.createDiv({ cls: "oa-logo", attr: { "aria-hidden": "true" } }); + const logoDataUrl = this.plugin.getPluginLogoDataUrl(); + if (logoDataUrl) { + logo.createEl("img", { + cls: "oa-logo-image", + attr: { + src: logoDataUrl, + alt: "", + }, + }); + } else { + logo.createSpan({ cls: "oa-logo-mark", text: "OA" }); + } + const brandText = brand.createDiv({ cls: "oa-brand-text" }); + const brandTitleRow = brandText.createDiv({ cls: "oa-brand-title-row" }); + brandTitleRow.createEl("h2", { text: "OpenAgent" }); + if (this.plugin.getDaemonStatus().state === DAEMON_CONNECTION_STATES.ONLINE) { + brandTitleRow.createSpan({ + cls: "oa-daemon-online-dot", + attr: { + "aria-label": "Codex server online", + title: this.plugin.getDaemonStatusDetail() || "Codex server is online.", + }, + }); + } + brandText.createDiv({ + cls: "oa-brand-subtitle", + text: activeTask?.cwd + ? compactPathLabel(activeTask.cwd) + : (activeWorkspace?.name || (workspaceSummariesLoading ? "Loading workspace..." : "Canvas-linked conversations")), + }); + const actions = headerTop.createDiv({ cls: "oa-action-row oa-header-actions" }); + this.makeButton(actions, "Refresh", () => { + void this.plugin.refreshTasks(); + }, false, { icon: "refresh-cw", iconOnly: true, tooltip: "Refresh threads" }); + if (activeCanvasPath) { + this.makeButton(actions, "Arrange", () => this.plugin.autoArrangeActiveCanvas(), false, { + icon: "layout-dashboard", + iconOnly: true, + tooltip: "Arrange canvas", + }); + } + if (taskDetailOpen && activeTask) { + const headerConversation = header.createDiv({ cls: "oa-conversation-heading" }); + headerConversation.createDiv({ cls: "oa-detail-title", text: activeTask.title || "Untitled task" }); + this.activeTaskStatusEl = headerConversation.createDiv({ + cls: `oa-status-tag${["running", "starting"].includes(String(activeTask.status || "")) ? " is-running" : ""}`, + text: activeTask.status || "idle", + }); + } + if (this.plugin.runtimeIssue) { + contentEl.createDiv({ + cls: "oa-banner oa-banner-error", + text: this.plugin.runtimeIssue, + }); + } + + const panelBody = contentEl.createDiv({ cls: "oa-settings-body" }); + const panelContent = panelBody.createDiv({ cls: "oa-settings-page-content" }); + this.renderPanelTabs(panelContent, panelTab); + if (panelTab === PANEL_TAB_OPTIONS.HEARTBEAT) { + this.renderHeartbeatPanel(panelContent); + this.restoreComposerFocusState(composerFocusState); + this.restorePanelScrollState(panelScrollState, panelScrollKey); + return; + } + if (panelTab === PANEL_TAB_OPTIONS.WORKSPACE) { + this.renderWorkspacePanel(panelContent, { + activeWorkspace, + workspaceSummariesLoading, + }); + this.restoreComposerFocusState(composerFocusState); + this.restorePanelScrollState(panelScrollState, panelScrollKey); + return; + } + if (!taskDetailOpen || !activeTask) { + this.renderThreadsPanel(panelContent, { + activeCanvasPath, + activeWorkspace, + activeTask, + archivedTasks, + runningTasks, + tasks, + }); + this.restoreComposerFocusState(composerFocusState); + this.restorePanelScrollState(panelScrollState, panelScrollKey); + return; + } + + const detail = panelContent.createDiv({ cls: "oa-detail-section" }); + + if (selectedGroupContextPreview) { + this.renderGroupContextPreview(detail, selectedGroupContextPreview); + } + + if (activeTaskArchived) { + detail.createDiv({ + cls: "oa-banner oa-banner-warning", + text: "Archived because its root Canvas node was deleted.", + }); + } + if (Array.isArray(activeTask.selectionContext?.warnings) && activeTask.selectionContext.warnings.length > 0) { + activeTask.selectionContext.warnings.forEach((warning) => { + detail.createDiv({ cls: "oa-banner oa-banner-warning", text: warning }); + }); + } + + if (activeTask.lastError) { + detail.createDiv({ cls: "oa-banner oa-banner-error", text: activeTask.lastError }); + } + + const messagesSection = detail.createDiv({ cls: "oa-messages-section" }); + this.messagesSectionEl = messagesSection; + this.renderedActiveTaskId = String(activeTask.taskId || ""); + this.renderTaskMessages(messagesSection, activeTask, { + didSwitchActiveTask, + panelScrollState, + panelScrollKey, + }); + + const composer = rootEl.createDiv({ cls: "oa-composer-section" }); + const composerInputShell = composer.createDiv({ cls: "oa-composer-input-shell" }); + const taskIsRunning = this.plugin.isTaskRunning(activeTask); + const canStopActiveTurn = Boolean(activeTask?.currentTurnId); + this.composerInput = composerInputShell.createEl("textarea", { cls: "oa-composer-input" }); + this.composerInput.dataset.taskId = activeTask.taskId; + this.composerInput.placeholder = "Add a follow-up message..."; + this.composerInput.rows = 2; + this.composerInput.value = this.plugin.getDraft(activeTask.taskId); + this.composerInput.addEventListener("focus", () => { + this.plugin.setComposerFocused(true); + }); + this.composerInput.addEventListener("input", (event) => { + this.plugin.setDraft(activeTask.taskId, event.target.value); + }); + this.composerInput.addEventListener("blur", () => { + this.plugin.setComposerFocused(false); + void this.plugin.persistPluginState(); + }); + this.composerInput.addEventListener("keydown", (event) => { + if (event.isComposing || event.keyCode === 229) { + return; + } + + if ((event.metaKey || event.ctrlKey) && event.key === "Enter") { + event.preventDefault(); + this.plugin.sendDraftForTask(activeTask.taskId, { draft: this.composerInput.value }); + } + }); + + const stopActionTitle = this.plugin.getStopActiveTaskButtonTitle(); + const composerActionButton = composerInputShell.createEl("button", { + cls: `oa-composer-action-button${canStopActiveTurn ? " is-stop" : " is-send"}`, + text: canStopActiveTurn ? "Stop" : "↑", + attr: { + type: "button", + "aria-label": canStopActiveTurn ? "Stop active task" : "Send message", + "aria-keyshortcuts": canStopActiveTurn ? this.plugin.getStopActiveTaskHotkey() : "", + title: canStopActiveTurn ? stopActionTitle : "Send", + }, + }); + composerActionButton.disabled = !canStopActiveTurn && taskIsRunning; + composerActionButton.addEventListener("click", () => { + if (canStopActiveTurn) { + void this.plugin.stopActiveTask(); + return; + } + this.plugin.sendDraftForTask(activeTask.taskId, { draft: this.composerInput?.value || "" }); + }); + + this.restoreComposerFocusState(composerFocusState); + } + + makeButton(container, label, onClick, disabled = false, options = {}) { + const button = new ButtonComponent(container); + button.setButtonText(options.iconOnly ? "" : label); + button.setDisabled(Boolean(disabled)); + if (options.icon && button.buttonEl) { + setIcon(button.buttonEl, options.icon); + button.buttonEl.addClass("oa-icon-button"); + if (options.iconOnly) { + button.buttonEl.addClass("is-icon-only"); + } + button.buttonEl.setAttribute("aria-label", String(options.tooltip || label || "Action")); + setTooltip(button.buttonEl, String(options.tooltip || label || "Action")); + } + if (options.runOnMouseDown && button.buttonEl) { + let ignoreNextClick = false; + button.buttonEl.addEventListener("mousedown", (event) => { + if (event.button !== 0 || button.buttonEl.disabled) { + return; + } + + event.preventDefault(); + ignoreNextClick = true; + onClick(); + }); + button.buttonEl.addEventListener("click", (event) => { + if (ignoreNextClick) { + event.preventDefault(); + event.stopPropagation(); + ignoreNextClick = false; + return; + } + + onClick(); + }); + return button; + } + + button.onClick(onClick); + return button; + } +} + +class OpenAgentVaultPet { + constructor(plugin) { + this.plugin = plugin; + this.rootEl = null; + this.bubbleEl = null; + this.chatEl = null; + this.chatPathEl = null; + this.chatCwdEl = null; + this.chatTextareaEl = null; + this.chatSendButtonEl = null; + this.dragState = null; + this.chatContext = null; + this.chatIsSending = false; + this.cleanupCallbacks = []; + this.idleTimer = null; + this.messageTimer = null; + this.saveTimer = null; + this.lastActivityAt = 0; + this.suppressNextClick = false; + } + + mount() { + if (this.rootEl) { + return; + } + + const root = document.createElement("div"); + root.className = "oa-vault-pet"; + root.dataset.mood = "idle"; + root.setAttribute("role", "button"); + root.setAttribute("tabindex", "0"); + root.setAttribute("aria-label", "OpenAgent vault pet"); + root.setAttribute("title", "OpenAgent vault pet"); + + const bubble = document.createElement("div"); + bubble.className = "oa-vault-pet-bubble"; + root.appendChild(bubble); + + const chat = document.createElement("div"); + chat.className = "oa-vault-pet-chat"; + chat.setAttribute("aria-label", "Vault pet selection chat"); + root.appendChild(chat); + + const chatHeader = document.createElement("div"); + chatHeader.className = "oa-vault-pet-chat-header"; + chat.appendChild(chatHeader); + + const chatTitle = document.createElement("div"); + chatTitle.className = "oa-vault-pet-chat-title"; + chatTitle.textContent = "Vault pet chat"; + chatHeader.appendChild(chatTitle); + + const chatCloseButton = document.createElement("button"); + chatCloseButton.className = "oa-vault-pet-chat-close"; + chatCloseButton.type = "button"; + chatCloseButton.setAttribute("aria-label", "Close vault pet chat"); + chatCloseButton.textContent = "x"; + chatHeader.appendChild(chatCloseButton); + + const chatPath = document.createElement("div"); + chatPath.className = "oa-vault-pet-chat-path"; + chat.appendChild(chatPath); + + const chatCwd = document.createElement("div"); + chatCwd.className = "oa-vault-pet-chat-cwd"; + chat.appendChild(chatCwd); + + const chatTextarea = document.createElement("textarea"); + chatTextarea.className = "oa-vault-pet-chat-input"; + chatTextarea.rows = 6; + chatTextarea.placeholder = "Chat or search from here..."; + chat.appendChild(chatTextarea); + + const chatActions = document.createElement("div"); + chatActions.className = "oa-vault-pet-chat-actions"; + chat.appendChild(chatActions); + + const chatHint = document.createElement("div"); + chatHint.className = "oa-vault-pet-chat-hint"; + chatHint.textContent = "Ctrl/Cmd Enter sends a new thread"; + chatActions.appendChild(chatHint); + + const chatSendButton = document.createElement("button"); + chatSendButton.className = "oa-vault-pet-chat-send"; + chatSendButton.type = "button"; + chatSendButton.textContent = "Send"; + chatActions.appendChild(chatSendButton); + + const creature = document.createElement("div"); + creature.className = "oa-vault-pet-creature"; + root.appendChild(creature); + + const mascot = document.createElement("img"); + mascot.className = "oa-vault-pet-mascot"; + mascot.alt = ""; + mascot.draggable = false; + mascot.src = this.plugin.getVaultPetMascotDataUrl(); + creature.appendChild(mascot); + + const shadow = document.createElement("div"); + shadow.className = "oa-vault-pet-shadow"; + root.appendChild(shadow); + + document.body.appendChild(root); + this.rootEl = root; + this.bubbleEl = bubble; + this.chatEl = chat; + this.chatPathEl = chatPath; + this.chatCwdEl = chatCwd; + this.chatTextareaEl = chatTextarea; + this.chatSendButtonEl = chatSendButton; + chatCloseButton.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + this.hideChat(); + }); + chatSendButton.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + void this.submitChat(); + }); + chatTextarea.addEventListener("keydown", (event) => { + event.stopPropagation(); + if ((event.metaKey || event.ctrlKey) && event.key === "Enter") { + event.preventDefault(); + void this.submitChat(); + } else if (event.key === "Escape") { + event.preventDefault(); + this.hideChat(); + } + }); + ["pointerdown", "pointermove", "pointerup", "click"].forEach((eventName) => { + chat.addEventListener(eventName, (event) => event.stopPropagation()); + }); + this.applyPosition(this.getStoredPosition()); + this.bindEvents(); + this.say(pickRandomItem(VAULT_PET_IDLE_PHRASES), { + mood: "idle", + timeoutMs: 4_800, + }); + this.idleTimer = window.setInterval(() => this.tick(), 13_000); + } + + unmount() { + window.clearInterval(this.idleTimer); + window.clearTimeout(this.messageTimer); + window.clearTimeout(this.saveTimer); + this.idleTimer = null; + this.messageTimer = null; + this.saveTimer = null; + this.cleanupCallbacks.forEach((cleanup) => cleanup()); + this.cleanupCallbacks = []; + this.rootEl?.remove(); + this.rootEl = null; + this.bubbleEl = null; + this.chatEl = null; + this.chatPathEl = null; + this.chatCwdEl = null; + this.chatTextareaEl = null; + this.chatSendButtonEl = null; + this.chatContext = null; + this.chatIsSending = false; + this.dragState = null; + } + + bindEvents() { + this.addListener(this.rootEl, "pointerdown", (event) => this.handlePointerDown(event)); + this.addListener(this.rootEl, "click", (event) => this.handleClick(event)); + this.addListener(this.rootEl, "keydown", (event) => this.handleKeydown(event)); + this.addListener(window, "resize", () => this.applyPosition(this.getStoredPosition())); + this.addListener(document, "pointermove", (event) => this.handlePointerMove(event)); + this.addListener(document, "pointerup", (event) => this.handlePointerUp(event)); + } + + addListener(target, eventName, handler) { + if (!target) { + return; + } + target.addEventListener(eventName, handler); + this.cleanupCallbacks.push(() => target.removeEventListener(eventName, handler)); + } + + handlePointerDown(event) { + if (event.button !== 0 || !this.rootEl) { + return; + } + const rect = this.rootEl.getBoundingClientRect(); + this.dragState = { + offsetX: event.clientX - rect.left, + offsetY: event.clientY - rect.top, + startX: event.clientX, + startY: event.clientY, + moved: false, + }; + this.rootEl.classList.add("is-dragging"); + this.rootEl.setPointerCapture?.(event.pointerId); + } + + handlePointerMove(event) { + if (!this.dragState || !this.rootEl) { + return; + } + const nextPosition = this.clampPosition({ + x: event.clientX - this.dragState.offsetX, + y: event.clientY - this.dragState.offsetY, + }); + if ( + Math.abs(event.clientX - this.dragState.startX) > 3 + || Math.abs(event.clientY - this.dragState.startY) > 3 + ) { + this.dragState.moved = true; + } + this.applyPosition(nextPosition, { save: false }); + } + + handlePointerUp(event) { + if (!this.dragState || !this.rootEl) { + return; + } + const wasMoved = this.dragState.moved; + this.dragState = null; + this.rootEl.classList.remove("is-dragging"); + this.rootEl.releasePointerCapture?.(event.pointerId); + this.schedulePositionSave(); + if (wasMoved) { + this.suppressNextClick = true; + this.say("I like this spot.", { + mood: "curious", + timeoutMs: 3_200, + }); + } + } + + handleClick(event) { + if (this.suppressNextClick) { + this.suppressNextClick = false; + event.preventDefault(); + return; + } + this.showQuickChat(); + } + + handleKeydown(event) { + if (event.key !== "Enter" && event.key !== " ") { + return; + } + event.preventDefault(); + this.showQuickChat(); + } + + tick() { + if (!this.rootEl || this.dragState) { + return; + } + if (Math.random() > 0.42) { + this.wander(); + } + if (Math.random() > 0.35) { + this.say(pickRandomItem(VAULT_PET_IDLE_PHRASES), { + mood: "idle", + timeoutMs: 4_600, + }); + } + } + + wander() { + const current = this.getCurrentPosition(); + const next = this.clampPosition({ + x: current.x + Math.round((Math.random() - 0.5) * 130), + y: current.y + Math.round((Math.random() - 0.5) * 92), + }); + this.applyPosition(next, { save: false }); + this.rootEl?.classList.add("is-wandering"); + window.setTimeout(() => this.rootEl?.classList.remove("is-wandering"), 850); + this.schedulePositionSave(); + } + + flyToRect(rect, options = {}) { + if (!this.rootEl || !isUsableClientRect(rect)) { + return false; + } + const side = rect.right + VAULT_PET_WIDTH + 24 < window.innerWidth ? "right" : "left"; + const targetX = side === "right" + ? rect.right + 12 + : rect.left - VAULT_PET_WIDTH - 12; + const targetY = rect.top + (rect.height / 2) - (VAULT_PET_HEIGHT * 0.58); + this.applyPosition({ + x: targetX, + y: targetY, + }, { save: false }); + this.rootEl.classList.add("is-summoned"); + window.setTimeout(() => this.rootEl?.classList.remove("is-summoned"), 920); + this.schedulePositionSave(); + this.say(options.message || "Selection spotted.", { + mood: "curious", + timeoutMs: 3_800, + }); + return true; + } + + showSelectionChat(context = {}) { + if (!this.rootEl || !this.chatEl || !this.chatTextareaEl) { + return; + } + this.chatContext = { + ...context, + selectedText: String(context.selectedText || ""), + filePath: String(context.filePath || ""), + absolutePath: String(context.absolutePath || ""), + cwd: String(context.cwd || ""), + }; + this.chatPathEl.textContent = this.chatContext.filePath + ? `File: ${this.chatContext.filePath}` + : "File: current selection"; + this.chatPathEl.title = this.chatContext.absolutePath || this.chatContext.filePath || ""; + this.chatCwdEl.textContent = this.chatContext.cwd + ? `CWD: ${this.chatContext.cwd}` + : "CWD: default workspace"; + this.chatCwdEl.title = this.chatContext.cwd || ""; + this.chatTextareaEl.value = this.chatContext.selectedText; + this.chatTextareaEl.placeholder = "Ask about the selected text..."; + this.chatTextareaEl.disabled = false; + if (this.chatSendButtonEl) { + this.chatSendButtonEl.disabled = false; + this.chatSendButtonEl.textContent = "Send"; + } + const currentPosition = this.getCurrentPosition(); + this.rootEl.classList.toggle("is-chat-right", currentPosition.x < window.innerWidth / 2); + this.rootEl.classList.add("has-chat"); + window.setTimeout(() => { + this.chatTextareaEl?.focus(); + this.chatTextareaEl?.select(); + }, 80); + } + + showQuickChat() { + if (!this.rootEl || !this.chatEl || !this.chatTextareaEl) { + return; + } + const context = this.plugin.getVaultPetQuickChatContext(); + this.chatContext = context; + this.chatPathEl.textContent = context.filePath + ? `File: ${context.filePath}` + : "File: current vault"; + this.chatPathEl.title = context.absolutePath || context.filePath || ""; + this.chatCwdEl.textContent = context.cwd + ? `CWD: ${context.cwd}` + : "CWD: default workspace"; + this.chatCwdEl.title = context.cwd || ""; + this.chatTextareaEl.value = ""; + this.chatTextareaEl.placeholder = "Chat or search from here..."; + this.chatTextareaEl.disabled = false; + if (this.chatSendButtonEl) { + this.chatSendButtonEl.disabled = false; + this.chatSendButtonEl.textContent = "Send"; + } + const currentPosition = this.getCurrentPosition(); + this.rootEl.classList.toggle("is-chat-right", currentPosition.x < window.innerWidth / 2); + this.rootEl.classList.add("has-chat"); + this.say("Ready.", { + mood: "curious", + timeoutMs: 1_400, + }); + window.setTimeout(() => { + this.chatTextareaEl?.focus(); + }, 80); + } + + hideChat() { + this.rootEl?.classList.remove("has-chat"); + } + + async submitChat() { + if (this.chatIsSending || !this.chatContext || !this.chatTextareaEl) { + return; + } + const message = String(this.chatTextareaEl.value || "").trim(); + if (!message) { + this.say("Give me words to swim with.", { + mood: "surprised", + timeoutMs: 3_000, + }); + return; + } + + this.chatIsSending = true; + this.chatTextareaEl.disabled = true; + if (this.chatSendButtonEl) { + this.chatSendButtonEl.disabled = true; + this.chatSendButtonEl.textContent = "Sending..."; + } + try { + await this.plugin.startVaultPetChat(this.chatContext, message); + this.say("Thread launched.", { + mood: "happy", + timeoutMs: 3_600, + }); + this.hideChat(); + } catch (error) { + const messageText = String(error?.message || error || "Unable to start chat."); + new Notice(messageText); + this.say("The current got weird.", { + mood: "surprised", + timeoutMs: 3_600, + }); + this.chatTextareaEl.disabled = false; + if (this.chatSendButtonEl) { + this.chatSendButtonEl.disabled = false; + this.chatSendButtonEl.textContent = "Send"; + } + } finally { + this.chatIsSending = false; + } + } + + pet() { + this.say(pickRandomItem(VAULT_PET_ACTIVITY_PHRASES.pet), { + mood: "happy", + timeoutMs: 4_200, + }); + this.rootEl?.classList.add("is-petted"); + window.setTimeout(() => this.rootEl?.classList.remove("is-petted"), 720); + } + + handleVaultActivity(kind, file) { + if (!this.rootEl) { + return; + } + const filePath = String(file?.path || ""); + if (!filePath || filePath.startsWith(".obsidian/plugins/openagent/")) { + return; + } + const now = Date.now(); + if (now - this.lastActivityAt < VAULT_PET_ACTIVITY_COOLDOWN_MS) { + return; + } + this.lastActivityAt = now; + this.say(pickRandomItem(VAULT_PET_ACTIVITY_PHRASES[kind]) || "The vault moved.", { + mood: kind === "delete" ? "surprised" : "happy", + timeoutMs: 4_400, + }); + this.rootEl.classList.add("is-excited"); + window.setTimeout(() => this.rootEl?.classList.remove("is-excited"), 950); + } + + handleWorkspaceChange() { + if (!this.rootEl || Date.now() - this.lastActivityAt < VAULT_PET_ACTIVITY_COOLDOWN_MS) { + return; + } + this.lastActivityAt = Date.now(); + this.say(pickRandomItem(VAULT_PET_ACTIVITY_PHRASES.workspace), { + mood: "curious", + timeoutMs: 3_800, + }); + } + + say(message, options = {}) { + if (!this.rootEl || !this.bubbleEl) { + return; + } + const mood = String(options.mood || "idle"); + this.rootEl.dataset.mood = mood; + this.bubbleEl.textContent = String(message || "Bloop."); + this.rootEl.classList.add("has-message"); + window.clearTimeout(this.messageTimer); + this.messageTimer = window.setTimeout(() => { + this.rootEl?.classList.remove("has-message"); + if (this.rootEl) { + this.rootEl.dataset.mood = "idle"; + } + }, Number(options.timeoutMs || 4_000)); + } + + resetPosition() { + if (this.plugin.uiState) { + this.plugin.uiState.vaultPetState = {}; + } + this.applyPosition(this.getDefaultPosition()); + this.say("Back to my splash zone.", { + mood: "happy", + timeoutMs: 3_600, + }); + this.schedulePositionSave(); + } + + getStoredPosition() { + const state = this.plugin.uiState?.vaultPetState || {}; + const x = Number(state.x); + const y = Number(state.y); + if (Number.isFinite(x) && Number.isFinite(y)) { + return this.clampPosition({ x, y }); + } + return this.getDefaultPosition(); + } + + getDefaultPosition() { + return this.clampPosition({ + x: window.innerWidth - VAULT_PET_WIDTH - 34, + y: window.innerHeight - VAULT_PET_HEIGHT - 30, + }); + } + + getCurrentPosition() { + if (!this.rootEl) { + return this.getDefaultPosition(); + } + return this.clampPosition({ + x: Number.parseFloat(this.rootEl.style.left) || 0, + y: Number.parseFloat(this.rootEl.style.top) || 0, + }); + } + + clampPosition(position) { + const maxX = Math.max(VAULT_PET_MARGIN, window.innerWidth - VAULT_PET_WIDTH - VAULT_PET_MARGIN); + const maxY = Math.max(VAULT_PET_MARGIN, window.innerHeight - VAULT_PET_HEIGHT - VAULT_PET_MARGIN); + return { + x: Math.min(Math.max(Number(position.x) || VAULT_PET_MARGIN, VAULT_PET_MARGIN), maxX), + y: Math.min(Math.max(Number(position.y) || VAULT_PET_MARGIN, VAULT_PET_MARGIN), maxY), + }; + } + + applyPosition(position, options = {}) { + if (!this.rootEl) { + return; + } + const next = this.clampPosition(position); + this.rootEl.style.left = `${next.x}px`; + this.rootEl.style.top = `${next.y}px`; + if (options.save !== false) { + this.schedulePositionSave(); + } + } + + schedulePositionSave() { + window.clearTimeout(this.saveTimer); + this.saveTimer = window.setTimeout(() => { + if (!this.plugin.uiState || !this.rootEl) { + return; + } + const position = this.getCurrentPosition(); + this.plugin.uiState.vaultPetState = { + x: Math.round(position.x), + y: Math.round(position.y), + }; + void this.plugin.persistPluginState(); + }, 500); + } +} + +class OpenAgentSettingTab extends PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + + display() { + const { containerEl } = this; + containerEl.empty(); + + containerEl.createEl("h2", { text: "OpenAgent" }); + + new Setting(containerEl) + .setName("Workspace root") + .setDesc("Vault folder where OpenAgent creates one symlinked project entry per repo.") + .addText((text) => { + text + .setPlaceholder("Workspaces") + .setValue(this.plugin.settings.workspaceRoot) + .onChange(async (value) => { + this.plugin.settings.workspaceRoot = String(value || "").trim() || DEFAULT_SETTINGS.workspaceRoot; + await this.plugin.persistPluginState(); + }); + }); + + new Setting(containerEl) + .setName("Automation folder") + .setDesc("Optional extra vault folder for automations. By default OpenAgent uses each workspace's Automations folder next to Main.canvas.") + .addText((text) => { + text + .setPlaceholder("Leave blank for workspace Automations folders") + .setValue(this.plugin.settings.automationFolder) + .onChange(async (value) => { + this.plugin.settings.automationFolder = String(value || "").trim(); + await this.plugin.persistPluginState(); + await this.plugin.ensureDefaultAutomationFile(); + this.plugin.scheduleAutomationSync(); + }); + }); + + new Setting(containerEl) + .setName("Codex server launch command") + .setDesc("Optional. When the server is offline, OpenAgent will run this shell command and retry automatically.") + .addText((text) => { + text + .setPlaceholder("cd /path/to/openagent && pnpm dev:daemon") + .setValue(this.plugin.settings.daemonLaunchCommand) + .onChange(async (value) => { + this.plugin.settings.daemonLaunchCommand = String(value || ""); + await this.plugin.persistPluginState(); + }); + }); + + new Setting(containerEl) + .setName("Codex server launch directory") + .setDesc("Optional working directory for the launch command above. Leave blank to use auto-discovery.") + .addText((text) => { + text + .setPlaceholder("/absolute/path/to/openagent") + .setValue(this.plugin.settings.daemonLaunchCwd) + .onChange(async (value) => { + this.plugin.settings.daemonLaunchCwd = String(value || ""); + await this.plugin.persistPluginState(); + }); + }); + + const daemonStatusSetting = new Setting(containerEl) + .setName(`Codex server status: ${this.plugin.getDaemonStatusLabel()}`) + .setDesc(this.plugin.getDaemonStatusDetail() || "Checks whether the local Codex server is reachable.") + .addButton((button) => { + button.setButtonText("Refresh"); + button.onClick(async () => { + await this.plugin.refreshDaemonStatus({ + silent: false, + forceRefresh: true, + }); + }); + }); + if (this.plugin.getDaemonStatus().state !== DAEMON_CONNECTION_STATES.ONLINE) { + daemonStatusSetting.addButton((button) => { + button.setButtonText("Start"); + button.onClick(async () => { + await this.plugin.startDaemonWithFeedback(); + }); + }); + } + + new Setting(containerEl) + .setName("Codex sandbox mode") + .setDesc("Choose how much access turns launched from this plugin get. Workspace-only stays inside the selected project folder. Full access removes the filesystem sandbox and should only be used for trusted work.") + .addDropdown((dropdown) => { + dropdown + .addOption(DAEMON_SANDBOX_MODE_OPTIONS.WORKSPACE_WRITE, "Workspace only (safer)") + .addOption(DAEMON_SANDBOX_MODE_OPTIONS.DANGER_FULL_ACCESS, "Full access (advanced)") + .setValue(normalizeDaemonSandboxMode(this.plugin.settings.daemonSandboxMode)) + .onChange(async (value) => { + this.plugin.settings.daemonSandboxMode = normalizeDaemonSandboxMode(value); + await this.plugin.persistPluginState(); + new Notice(`OpenAgent runtime mode: ${this.plugin.describeRuntimeConfig({ sandboxMode: value })}.`); + }); + }); + + containerEl.createDiv({ + cls: "oa-task-meta", + text: getDaemonSandboxModeHelpText(this.plugin.settings.daemonSandboxMode), + }); + + new Setting(containerEl) + .setName("Workspace") + .setDesc("Create or open a workspace folder that points to a real repo on disk.") + .addButton((button) => { + button.setButtonText("New workspace"); + button.onClick(() => { + this.plugin.showWorkspacePicker(); + }); + }); + + new Setting(containerEl) + .setName("Stop active task hotkey") + .setDesc("Optional. Click the box, then press a shortcut like Mod+. or Mod+Shift+S to interrupt the current OpenAgent run. Backspace clears it.") + .addText((text) => { + text + .setPlaceholder("Click and press a shortcut") + .setValue(this.plugin.getStopActiveTaskHotkeyLabel()); + text.inputEl.readOnly = true; + text.inputEl.classList.add(HOTKEY_CAPTURE_INPUT_CLASS); + text.inputEl.addEventListener("focus", () => { + text.inputEl.select(); + }); + text.inputEl.addEventListener("keydown", (event) => { + if (event.key === "Tab" && !event.metaKey && !event.ctrlKey && !event.altKey) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (event.isComposing || event.keyCode === 229) { + return; + } + + if (event.key === "Backspace" || event.key === "Delete") { + this.plugin.settings.stopActiveTaskHotkey = ""; + text.setValue(""); + this.plugin.requestViewRefresh(); + void this.plugin.persistPluginState(); + return; + } + + const nextHotkey = normalizeHotkeyFromEvent(event); + if (!nextHotkey) { + return; + } + + this.plugin.settings.stopActiveTaskHotkey = nextHotkey; + text.setValue(this.plugin.getStopActiveTaskHotkeyLabel()); + this.plugin.requestViewRefresh(); + void this.plugin.persistPluginState(); + }); + }) + .addButton((button) => { + button.setButtonText("Clear"); + button.onClick(async () => { + this.plugin.settings.stopActiveTaskHotkey = ""; + await this.plugin.persistPluginState(); + this.plugin.requestViewRefresh(); + this.display(); + }); + }); + + if (this.plugin.getDaemonStatus().state !== DAEMON_CONNECTION_STATES.ONLINE) { + new Setting(containerEl) + .setName("Start server now") + .setDesc("Useful after changing launch settings or if you want to warm it up before using Canvas.") + .addButton((button) => { + button.setButtonText("Start"); + button.onClick(async () => { + await this.plugin.startDaemonWithFeedback(); + }); + }); + } + + containerEl.createEl("h3", { text: "Vault pet" }); + + new Setting(containerEl) + .setName("Vault pet mascot") + .setDesc("Keep a small animated vault pet floating inside Obsidian.") + .addToggle((toggle) => { + toggle + .setValue(this.plugin.isVaultPetEnabled()) + .onChange(async (value) => { + this.plugin.settings.enableVaultPet = value === true; + this.plugin.configureVaultPet(); + await this.plugin.persistPluginState(); + }); + }) + .addButton((button) => { + button.setButtonText("Pet"); + button.onClick(() => { + this.plugin.petVaultOctopus(); + }); + }) + .addButton((button) => { + button.setButtonText("Reset spot"); + button.onClick(async () => { + this.plugin.resetVaultPetPosition(); + await this.plugin.persistPluginState(); + }); + }); + + containerEl.createEl("h3", { text: "Developer options" }); + + new Setting(containerEl) + .setName("Enable smoke request polling") + .setDesc("Developer only. Poll `.openagent/smoke-request.json` in the vault and execute smoke runs automatically.") + .addToggle((toggle) => { + toggle + .setValue(this.plugin.isDevSmokePollingEnabled()) + .onChange(async (value) => { + this.plugin.settings.enableDevSmokeRequests = value === true; + this.plugin.configureDevSmokePolling(); + await this.plugin.persistPluginState(); + }); + }); + + new Setting(containerEl) + .setName("Enable debug logging") + .setDesc("Developer only. Record OpenAgent debug events and append them to `.openagent/new-thread-debug.jsonl` in the vault.") + .addToggle((toggle) => { + toggle + .setValue(this.plugin.isDebugLoggingEnabled()) + .onChange(async (value) => { + this.plugin.settings.enableDebugLogging = value === true; + if (!this.plugin.isDebugLoggingEnabled()) { + this.plugin.debugEvents = []; + } + await this.plugin.persistPluginState(); + this.plugin.requestViewRefresh(); + }); + }); + } +} + +module.exports = class OpenAgentPlugin extends Plugin { + buildCanvasNodeTextCacheKey(canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedNodeId) { + return ""; + } + return `${normalizedCanvasPath}::${normalizedNodeId}`; + } + + setCanvasNodeEditorText(canvasPath, nodeId, text) { + const cacheKey = this.buildCanvasNodeTextCacheKey(canvasPath, nodeId); + if (!cacheKey) { + return; + } + this.liveCanvasNodeTextByKey.set(cacheKey, { + text: String(text || ""), + updatedAt: Date.now(), + }); + } + + getCanvasNodeEditorText(canvasPath, nodeId) { + const cacheKey = this.buildCanvasNodeTextCacheKey(canvasPath, nodeId); + if (!cacheKey) { + return undefined; + } + const entry = this.liveCanvasNodeTextByKey.get(cacheKey); + if (!entry) { + return undefined; + } + if (Date.now() - Number(entry.updatedAt || 0) > CANVAS_EDITOR_TEXT_CACHE_TTL_MS) { + this.liveCanvasNodeTextByKey.delete(cacheKey); + return undefined; + } + return String(entry.text || ""); + } + + registerCanvasEditorTrackingExtension() { + if (!EditorView || !editorInfoField || typeof this.registerEditorExtension !== "function") { + return; + } + + this.registerEditorExtension([ + EditorView.updateListener.of((update) => { + if (!update.docChanged) { + return; + } + + let editorInfo; + try { + editorInfo = update.state.field(editorInfoField); + } catch { + return; + } + + const node = editorInfo?.node; + const canvasPath = String(node?.canvas?.view?.file?.path || "").trim(); + const nodeId = String(node?.getData?.()?.id || node?.id || "").trim(); + if (!canvasPath || !nodeId) { + return; + } + + this.setCanvasNodeEditorText(canvasPath, nodeId, update.state.doc.toString()); + }), + ]); + } + + async onload() { + const savedState = (await this.loadData()) || {}; + const savedVaultId = String(savedState.vaultId || savedState.uiState?.vaultId || "").trim(); + const didCreateVaultId = !savedVaultId; + this.vaultId = savedVaultId || createVaultId(); + this.settings = { + ...DEFAULT_SETTINGS, + ...(savedState.settings || {}), + }; + if (this.settings.automationFolder === "OpenAgent/Automations") { + this.settings.automationFolder = ""; + } + this.settings.daemonSandboxMode = normalizeDaemonSandboxMode(this.settings.daemonSandboxMode); + this.settings.stopActiveTaskHotkey = normalizeStopHotkeySetting(this.settings.stopActiveTaskHotkey); + this.uiState = { + activeTaskId: savedState.uiState?.activeTaskId ?? savedState.activeTaskId ?? null, + panelTab: normalizePanelTab(savedState.uiState?.panelTab ?? savedState.panelTab), + taskDetailOpen: savedState.uiState?.taskDetailOpen === true, + draftsByTaskId: savedState.uiState?.draftsByTaskId ?? savedState.draftsByTaskId ?? {}, + canvasNodeHighlightStateByKey: savedState.uiState?.canvasNodeHighlightStateByKey ?? {}, + unreadTaskStateById: normalizeUnreadTaskState( + savedState.uiState?.unreadTaskStateById + ?? savedState.unreadTaskStateById + ?? {} + ), + vaultPetState: savedState.uiState?.vaultPetState ?? {}, + }; + const savedSyncState = savedState.syncState || {}; + this.daemonLauncher = new OpenAgentDaemonLauncher(this); + this.api = new OpenAgentApiClient({ + daemonLauncher: this.daemonLauncher, + }); + this.resolver = new CanvasSelectionResolver(this.app, this); + this.runtimeIssue = ""; + this.tasksById = {}; + this.viewRefreshTimer = null; + this.canvasSelectionCaptureTimer = null; + this.activeStreamDisposer = null; + this.activeStreamReconnectTimer = null; + this.activeStreamTaskId = ""; + this.activeStreamSessionId = 0; + this.runningTaskStreamDisposers = new Map(); + this.runningTaskStreamReconnectTimers = new Map(); + this.runningTaskStreamSessionIds = {}; + this.lastCanvasSelectionSnapshot = null; + this.devSmokeRunPromise = null; + this.lastProcessedSmokeRequestId = ""; + this.logoDataUrl = ""; + this.logoLoadPromise = null; + this.vaultPetMascotDataUrl = ""; + this.debugEvents = []; + this.devSmokePollIntervalId = null; + this.daemonStatus = createDaemonStatusSnapshot({ + state: DAEMON_CONNECTION_STATES.CHECKING, + }); + this.daemonStatusRefreshPromise = null; + this.settingTab = null; + this.resultNodeSyncStateByTaskId = normalizeResultNodeSyncState( + savedSyncState.resultNodeSyncStateByTaskId + || savedState.uiState?.resultNodeSyncStateByTaskId + || {} + ); + this.resultNodeSyncInFlight = new Set(); + this.canvasRunSourceRefByTaskId = normalizeCanvasRunSourceRefState( + savedSyncState.canvasRunSourceRefByTaskId + || savedState.uiState?.canvasRunSourceRefByTaskId + || {} + ); + this.canvasSnapshotCacheByPath = new Map(); + this.canvasMutationQueueByPath = new Map(); + this.canvasPopupMenuPatchStateByMenu = new Map(); + this.canvasNodeHighlightSyncInFlight = new Set(); + this.canvasNodeHighlightSyncPending = new Set(); + this.canvasAutoRunInFlightByKey = new Set(); + this.taskDetailRefreshInFlight = new Set(); + this.composerFocused = false; + this.taskListHovered = false; + this.pendingViewRefresh = false; + this.workspaceSummaryCacheByConfigPath = new Map(); + this.workspaceSummariesLoadPromise = null; + this.workspaceSummariesLoaded = false; + this.automationSyncTimer = null; + this.automationSyncPromise = null; + this.selectedGroupContextPreviewState = { + key: "", + preview: null, + loading: false, + }; + this.selectedGroupContextPreviewLoadPromise = null; + this.liveCanvasNodeTextByKey = new Map(); + this.vaultPet = null; + + this.registerView(VIEW_TYPE, (leaf) => new OpenAgentView(leaf, this)); + this.registerView(VOICE_GRAPH_VIEW_TYPE, (leaf) => new OpenAgentVoiceGraphView(leaf, this)); + this.registerCanvasEditorTrackingExtension(); + this.settingTab = new OpenAgentSettingTab(this.app, this); + this.addSettingTab(this.settingTab); + this.configureVaultPet(); + this.configureDevSmokePolling(); + this.registerInterval(window.setInterval(() => { + void this.refreshDaemonStatus({ + silent: true, + }); + }, DAEMON_STATUS_POLL_MS)); + this.registerEvent(this.app.vault.on("create", (file) => { + this.handleWorkspaceConfigMutation(file); + this.handleAutomationFileMutation(file); + this.handleSelectedGroupContextDependencyMutation(file); + this.handleCanvasFileMutation(file); + this.handleVaultPetActivity("create", file); + })); + this.registerEvent(this.app.vault.on("modify", (file) => { + this.handleWorkspaceConfigMutation(file); + this.handleAutomationFileMutation(file); + this.handleSelectedGroupContextDependencyMutation(file); + this.handleCanvasFileMutation(file); + this.handleVaultPetActivity("modify", file); + })); + this.registerEvent(this.app.vault.on("delete", (file) => { + this.handleWorkspaceConfigMutation(file); + this.handleAutomationFileMutation(file); + this.handleSelectedGroupContextDependencyMutation(file); + this.handleCanvasFileMutation(file); + this.handleVaultPetActivity("delete", file); + })); + this.registerEvent(this.app.vault.on("rename", (file, oldPath) => { + this.handleWorkspaceConfigMutation(file, oldPath); + this.handleAutomationFileMutation(file, oldPath); + this.handleSelectedGroupContextDependencyMutation(file, oldPath); + this.handleCanvasFileMutation(file); + this.handleVaultPetActivity("rename", file); + })); + this.registerEvent(this.app.workspace.on("active-leaf-change", () => { + this.ensureCanvasPopupMenuPatches(); + this.ensureCanvasSelectionTrackingPatches(); + this.captureCanvasSelectionSnapshot(); + const activeCanvasPath = this.getActiveCanvasPath(); + if (activeCanvasPath) { + this.getCanvasSnapshotSync(activeCanvasPath); + } + this.syncActiveTaskToCanvasContext({ markReadOnSelection: true }); + void this.refreshSelectedGroupContextPreview(); + this.requestViewRefresh(); + this.handleVaultPetWorkspaceChange(); + })); + this.registerEvent(this.app.workspace.on("layout-change", () => { + this.ensureCanvasPopupMenuPatches(); + this.ensureCanvasSelectionTrackingPatches(); + })); + this.registerDomEvent(document, "keydown", (event) => { + void this.handleStopActiveTaskHotkey(event); + }); + const initialCanvasPath = this.getActiveCanvasPath(); + if (initialCanvasPath) { + this.getCanvasSnapshotSync(initialCanvasPath); + } + this.ensureCanvasPopupMenuPatches(); + this.ensureCanvasSelectionTrackingPatches(); + this.captureCanvasSelectionSnapshot(); + + this.addCommand({ + id: "openagent-new-thread-from-selection", + name: "New thread from selection", + callback: () => this.handleNewThreadFromSelectionCommand(), + }); + + this.addCommand({ + id: "openagent-choose-repo-workspace", + name: "Choose workspace", + callback: () => this.showWorkspacePicker(), + }); + + this.addCommand({ + id: "openagent-open-panel", + name: "Open tasks", + callback: () => this.activateView(), + }); + + this.addCommand({ + id: "openagent-open-voice-graph", + name: "Open voice graph", + callback: () => { + void this.activateVoiceGraphView(); + }, + }); + + this.addCommand({ + id: "openagent-open-thread-list", + name: "Open thread list", + callback: () => { + void this.openThreadList(); + }, + }); + + this.addCommand({ + id: "openagent-resume-last-task", + name: "Resume last task", + callback: () => this.resumeLastTask(), + }); + + this.addCommand({ + id: "openagent-stop-active-task", + name: "Stop active task", + callback: () => this.stopActiveTask(), + }); + + this.addCommand({ + id: "openagent-auto-arrange-active-canvas", + name: "Auto arrange active canvas", + callback: () => this.autoArrangeActiveCanvas(), + }); + + this.addCommand({ + id: "openagent-start-daemon", + name: "Start Codex server", + callback: () => { + void this.startDaemonWithFeedback(); + }, + }); + + this.addCommand({ + id: "openagent-sync-automations", + name: "Sync automations", + callback: () => { + void this.syncAutomationsWithFeedback(); + }, + }); + + this.addCommand({ + id: "openagent-run-daily-vault-review", + name: "Run daily vault review", + callback: () => { + void this.runAutomationWithFeedback("daily-vault-review"); + }, + }); + + this.addCommand({ + id: "openagent-create-follow-up-node", + name: "Create follow-up node", + callback: () => { + void this.handleCreateFollowUpNodeCommand(); + }, + }); + + this.addCommand({ + id: "openagent-create-fork-node", + name: "Create fork node", + callback: () => { + void this.handleCreateForkNodeCommand(); + }, + }); + + this.addCommand({ + id: "openagent-toggle-vault-pet", + name: "Toggle vault mascot", + callback: () => { + void this.toggleVaultPet(); + }, + }); + + this.addCommand({ + id: "openagent-pet-vault-octopus", + name: "Pet vault mascot", + callback: () => { + this.petVaultOctopus(); + }, + }); + + this.addCommand({ + id: "openagent-summon-vault-octopus-to-selection", + name: "Summon vault mascot to selection", + hotkeys: [ + { + modifiers: ["Ctrl"], + key: "r", + }, + ], + callback: () => { + this.summonVaultPetToSelection(); + }, + }); + + this.app.workspace.onLayoutReady(() => { + this.ensureCanvasPopupMenuPatches(); + this.ensureCanvasSelectionTrackingPatches(); + this.captureCanvasSelectionSnapshot(); + void this.ensurePanelVisibleOnStartup(); + }); + void this.ensureWorkspaceSummariesLoaded(); + void this.ensureDefaultAutomationFile().then(() => this.syncAutomationsToDaemon()).catch(() => {}); + void this.ensurePluginLogoDataUrlLoaded(); + void this.refreshDaemonStatus(); + void this.refreshTasks().catch(() => {}); + if (didCreateVaultId) { + void this.persistPluginState(); + } + } + + async onunload() { + window.clearTimeout(this.canvasSelectionCaptureTimer); + this.canvasSelectionCaptureTimer = null; + window.clearTimeout(this.automationSyncTimer); + this.automationSyncTimer = null; + this.disposeActiveStream(); + this.disposeAllRunningTaskStreams(); + this.restoreCanvasPopupMenuPatches(); + this.vaultPet?.unmount(); + this.vaultPet = null; + try { + await this.persistPluginState(); + } catch { + // Ignore persistence failures during plugin teardown. + } + this.app.workspace.getLeavesOfType(VIEW_TYPE).forEach((leaf) => leaf.detach()); + this.app.workspace.getLeavesOfType(VOICE_GRAPH_VIEW_TYPE).forEach((leaf) => leaf.detach()); + } + + async persistPluginState() { + await this.saveData({ + vaultId: this.vaultId, + settings: this.settings, + uiState: this.uiState, + syncState: { + resultNodeSyncStateByTaskId: this.resultNodeSyncStateByTaskId, + canvasRunSourceRefByTaskId: this.canvasRunSourceRefByTaskId, + }, + }); + } + + isVaultPetEnabled() { + return this.settings?.enableVaultPet !== false; + } + + configureVaultPet() { + if (!this.isVaultPetEnabled()) { + this.vaultPet?.unmount(); + this.vaultPet = null; + return; + } + if (!this.vaultPet) { + this.vaultPet = new OpenAgentVaultPet(this); + } + this.vaultPet.mount(); + } + + async toggleVaultPet() { + this.settings.enableVaultPet = !this.isVaultPetEnabled(); + this.configureVaultPet(); + await this.persistPluginState(); + new Notice(this.isVaultPetEnabled() ? "Vault pet is awake." : "Vault pet is napping."); + this.settingTab?.display(); + } + + petVaultOctopus() { + if (!this.isVaultPetEnabled()) { + this.settings.enableVaultPet = true; + this.configureVaultPet(); + void this.persistPluginState(); + } + this.vaultPet?.pet(); + } + + summonVaultPetToSelection() { + if (!this.isVaultPetEnabled()) { + this.settings.enableVaultPet = true; + this.configureVaultPet(); + void this.persistPluginState(); + } else { + this.configureVaultPet(); + } + + const chatContext = this.getActiveMarkdownSelectionChatContext(); + const selectionRect = this.getActiveSelectionClientRect(); + if (!selectionRect || !chatContext?.selectedText) { + new Notice("Select some text first, then summon the vault pet."); + this.vaultPet?.say("Point me at some text.", { + mood: "surprised", + timeoutMs: 3_400, + }); + return; + } + + const didFly = this.vaultPet?.flyToRect(selectionRect, { + message: "I found the thought.", + }); + this.vaultPet?.showSelectionChat(chatContext); + if (!didFly) { + new Notice("Vault pet could not find a visible selection."); + } + } + + getActiveMarkdownSelectionChatContext() { + const file = this.app.workspace.activeLeaf?.view?.file || this.app.workspace.getActiveFile(); + if (!(file instanceof TFile)) { + return null; + } + const selectedText = this.getActiveSelectedText(); + if (!selectedText.trim()) { + return null; + } + + const vaultBasePath = this.getVaultBasePath(); + const absolutePath = vaultBasePath ? path.resolve(vaultBasePath, file.path) : ""; + const selectionContext = this.buildVaultPetSelectionContext({ + file, + selectedText, + absolutePath, + }); + const cwd = this.getDefaultCwdForVaultPetSelection(file.path, selectionContext); + return { + filePath: file.path, + fileName: file.basename || file.name || basenameVaultPath(file.path), + absolutePath, + selectedText, + cwd, + selectionContext, + }; + } + + getActiveSelectedText() { + const activeViewContainer = this.app.workspace.activeLeaf?.view?.containerEl; + const nativeSelection = document.getSelection?.(); + if (nativeSelection && !nativeSelection.isCollapsed) { + const selectedText = String(nativeSelection.toString() || ""); + if (selectedText.trim()) { + const anchorNode = nativeSelection.anchorNode; + const focusNode = nativeSelection.focusNode; + const anchorElement = anchorNode?.nodeType === Node.ELEMENT_NODE ? anchorNode : anchorNode?.parentElement; + const focusElement = focusNode?.nodeType === Node.ELEMENT_NODE ? focusNode : focusNode?.parentElement; + if ( + !activeViewContainer + || (anchorElement && activeViewContainer.contains(anchorElement)) + || (focusElement && activeViewContainer.contains(focusElement)) + ) { + return selectedText; + } + } + } + + const editorSelection = this.app.workspace.activeLeaf?.view?.editor?.getSelection?.(); + return String(editorSelection || ""); + } + + buildVaultPetSelectionContext({ file, selectedText, absolutePath }) { + const filePath = String(file?.path || "").trim(); + const selectionText = String(selectedText || "").trim(); + const selectionId = `vault-pet-${shortHash(`${filePath}\n${selectionText}\n${Date.now()}`)}`; + return { + canvasPath: filePath, + canvasName: file?.basename || file?.name || basenameVaultPath(filePath), + nodeIds: [selectionId], + textBlocks: [ + { + id: selectionId, + text: selectionText, + }, + ], + markdownFiles: [ + { + id: `file-${shortHash(filePath)}`, + path: filePath, + absolutePath: String(absolutePath || ""), + name: file?.name || basenameVaultPath(filePath), + content: "", + }, + ], + imageFiles: [], + warnings: [], + title: `${file?.basename || basenameVaultPath(filePath) || "Markdown"} selection`, + }; + } + + getDefaultCwdForVaultPetSelection(filePath, selectionContext) { + const workspace = this.getWorkspaceForVaultPath(filePath); + return workspace?.repoPath + || this.resolveWorkspaceRepoPathForSelection(selectionContext) + || this.resolver.inferWorkingDirectory(selectionContext) + || this.getVaultBasePath(); + } + + getVaultPetQuickChatContext(options = {}) { + const preferCanvas = options.preferCanvas === true; + const preferVaultCanvas = options.preferVaultCanvas === true; + const vaultCanvasFile = preferVaultCanvas ? this.getVaultRootCanvasFile() : null; + const explicitFile = options.file instanceof TFile ? options.file : null; + const activeLeafFile = this.app.workspace.activeLeaf?.view?.file; + const activeFile = activeLeafFile instanceof TFile ? activeLeafFile : null; + const canvasFile = this.resolver.getActiveCanvasView()?.file; + const activeCanvasFile = canvasFile instanceof TFile ? canvasFile : null; + const workspaceActiveFile = this.app.workspace.getActiveFile(); + const file = explicitFile + || vaultCanvasFile + || (preferCanvas ? activeCanvasFile : activeFile) + || workspaceActiveFile + || activeCanvasFile + || activeFile; + const filePath = file instanceof TFile ? String(file.path || "").trim() : ""; + const vaultBasePath = this.getVaultBasePath(); + const absolutePath = filePath && vaultBasePath ? path.resolve(vaultBasePath, filePath) : ""; + const selectionContext = this.buildVaultPetQuickChatSelectionContext({ + file, + filePath, + absolutePath, + }); + const cwd = this.getDefaultCwdForVaultPetSelection(filePath, selectionContext); + return { + mode: "quick", + filePath, + fileName: file instanceof TFile ? (file.basename || file.name || basenameVaultPath(filePath)) : "", + absolutePath, + selectedText: "", + cwd, + targetCanvasPath: vaultCanvasFile?.path || "", + selectionContext, + }; + } + + getVaultRootCanvasFile() { + const rootCanvasFiles = this.app.vault.getFiles() + .filter((file) => file instanceof TFile && file.extension === "canvas") + .filter((file) => { + const filePath = String(file.path || "").trim(); + return filePath && !filePath.includes("/") && !filePath.startsWith("."); + }) + .sort((left, right) => left.path.localeCompare(right.path)); + if (rootCanvasFiles.length === 0) { + return null; + } + + const vaultName = String(this.app.vault.getName?.() || "").trim(); + const vaultBaseName = path.basename(this.getVaultBasePath() || ""); + const preferredNames = [ + vaultName ? `${vaultName} Vault.canvas` : "", + vaultBaseName ? `${vaultBaseName} Vault.canvas` : "", + vaultName ? `${vaultName}.canvas` : "", + vaultBaseName ? `${vaultBaseName}.canvas` : "", + "Vault.canvas", + DEFAULT_WORKSPACE_CANVAS_FILE, + ] + .map((name) => name.toLowerCase()) + .filter(Boolean); + + return rootCanvasFiles.find((file) => preferredNames.includes(basenameVaultPath(file.path).toLowerCase())) + || rootCanvasFiles[0]; + } + + buildVaultPetQuickChatSelectionContext({ file, filePath, absolutePath }) { + const normalizedFilePath = String(filePath || "").trim(); + const baseTitle = file instanceof TFile + ? (file.basename || basenameVaultPath(normalizedFilePath) || "Vault") + : "Vault"; + const nodeId = `vault-pet-quick-${shortHash(`${normalizedFilePath}\n${Date.now()}`)}`; + const text = normalizedFilePath + ? `Quick chat from active file: ${normalizedFilePath}` + : "Quick chat from Obsidian vault."; + return { + canvasPath: normalizedFilePath || "vault-pet/quick-chat", + canvasName: baseTitle, + nodeIds: [nodeId], + textBlocks: [ + { + id: nodeId, + text, + }, + ], + markdownFiles: normalizedFilePath && !/\.canvas$/i.test(normalizedFilePath) + ? [ + { + id: `file-${shortHash(normalizedFilePath)}`, + path: normalizedFilePath, + absolutePath: String(absolutePath || ""), + name: file?.name || basenameVaultPath(normalizedFilePath), + content: "", + }, + ] + : [], + imageFiles: [], + warnings: [], + title: normalizedFilePath ? `${baseTitle} quick chat` : "Vault pet quick chat", + }; + } + + async startVaultPetChat(context = {}, message = "") { + return this.startVaultPetSelectionChat(context, message); + } + + async startVaultPetSelectionChat(context = {}, message = "") { + const rawPrompt = String(message || "").trim(); + if (!rawPrompt) { + throw new Error("Write a chat message first."); + } + const materialized = await this.materializeVaultPetChatOnCanvas(context, { + message, + rawPrompt, + }); + const selectionContext = materialized.selectionContext; + const cwd = materialized.cwd; + + await this.activateView(); + const response = await this.api.createTaskFromCanvasSelection(this.withVaultScope({ + ...selectionContext, + cwd, + forceNewTask: true, + runtimeConfig: this.buildRuntimeConfigPayload(), + })); + const task = this.mergeTask(response.task, { adoptCurrentVault: true }); + this.runtimeIssue = ""; + await this.setActiveTask(task.taskId, { revealInActiveTab: true }); + + if (!task.cwd) { + new Notice("Set a working directory in the OpenAgent panel to continue."); + return task; + } + + new Notice("Starting a new OpenAgent thread from this selection."); + await this.api.runTask(task.taskId, { + rawPrompt, + transcriptMessage: String(message || "").trim() || rawPrompt, + forceContext: false, + runtimeConfig: this.buildRuntimeConfigPayload(), + }); + await this.refreshTask(task.taskId); + void this.revealCanvasNode(selectionContext.canvasPath, selectionContext.nodeIds?.[0] || ""); + return this.tasksById[task.taskId] || task; + } + + async materializeVaultPetChatOnCanvas(context = {}, options = {}) { + const rawPrompt = String(options.rawPrompt || "").trim(); + const message = String(options.message || "").trim(); + const sourceSelection = context.selectionContext || this.buildVaultPetSelectionContext({ + file: this.app.workspace.getActiveFile(), + selectedText: context.selectedText, + absolutePath: context.absolutePath, + }); + const requestedCwd = String(context.cwd || "").trim() + || this.getDefaultCwdForVaultPetSelection(context.filePath, sourceSelection); + const cwd = normalizeRepoPath(requestedCwd || this.getVaultBasePath()); + const targetCanvasPath = String(context.targetCanvasPath || "").trim(); + let workspace = null; + let canvasPath = targetCanvasPath; + if (canvasPath) { + const targetCanvasFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(targetCanvasFile instanceof TFile) || targetCanvasFile.extension !== "canvas") { + throw new Error(`Canvas file not found: ${canvasPath}`); + } + } else { + workspace = await this.ensureWorkspaceForRepoPath(cwd, path.basename(cwd || "Vault")); + canvasPath = joinVaultPath(workspace.folderPath, workspace.defaultCanvas || DEFAULT_WORKSPACE_CANVAS_FILE); + } + const sourceFilePath = String(context.filePath || "").trim(); + const absolutePath = String(context.absolutePath || "").trim(); + const title = context.mode === "quick" + ? "Vault pet quick chat" + : "Vault pet selection chat"; + const displayText = String(message || "").trim(); + const node = await this.appendVaultPetPromptNodeToCanvas(canvasPath, { + title, + text: displayText, + }); + const markdownFiles = sourceFilePath && !/\.canvas$/i.test(sourceFilePath) + ? [ + { + id: `file-${shortHash(sourceFilePath)}`, + path: sourceFilePath, + absolutePath, + name: context.fileName || basenameVaultPath(sourceFilePath), + content: "", + }, + ] + : []; + + return { + cwd: workspace?.repoPath || cwd, + selectionContext: this.withVaultScope({ + canvasPath, + canvasName: basenameVaultPath(canvasPath).replace(/\.canvas$/i, ""), + nodeIds: [node.id], + textBlocks: [ + { + id: node.id, + text: rawPrompt || displayText, + }, + ], + markdownFiles, + imageFiles: [], + warnings: [], + title: displayText.slice(0, 80) || title, + }), + }; + } + + async appendVaultPetPromptNodeToCanvas(canvasPath, options = {}) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + throw new Error("Vault pet chat is missing a target Canvas."); + } + + return this.withSerializedCanvasMutation(normalizedCanvasPath, async () => { + const abstractFile = this.app.vault.getAbstractFileByPath(normalizedCanvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + throw new Error(`Canvas file not found: ${normalizedCanvasPath}`); + } + + const raw = await this.app.vault.cachedRead(abstractFile); + let parsed; + try { + parsed = raw.trim() ? JSON.parse(raw) : { nodes: [], edges: [] }; + } catch { + throw new Error(`Unable to parse canvas JSON for ${normalizedCanvasPath}`); + } + + const nodes = Array.isArray(parsed?.nodes) ? [...parsed.nodes] : []; + const edges = Array.isArray(parsed?.edges) ? [...parsed.edges] : []; + const text = String(options.text || "").trim() || "Vault pet chat"; + const width = RESULT_NODE_DEFAULT_WIDTH; + const height = FOLLOW_UP_NODE_DEFAULT_HEIGHT; + const maxBottom = nodes.reduce((maxValue, node) => { + const nodeY = toFiniteNumber(node?.y, 80); + const nodeHeight = toFiniteNumber(node?.height, FOLLOW_UP_NODE_DEFAULT_HEIGHT); + return Math.max(maxValue, nodeY + nodeHeight); + }, CANVAS_LAYOUT_BASE_Y - RESULT_NODE_Y_GAP); + const node = { + id: createCanvasObjectId("oa-pet-chat"), + type: "text", + x: 80, + y: maxBottom + RESULT_NODE_Y_GAP, + width, + height, + text, + }; + nodes.push(node); + + const nextParsed = { + ...parsed, + nodes, + edges, + }; + await this.app.vault.modify(abstractFile, JSON.stringify(nextParsed, null, 2) + "\n"); + this.primeCanvasSnapshot(normalizedCanvasPath, nextParsed); + return node; + }); + } + + getActiveSelectionClientRect() { + return this.getNativeSelectionClientRect() + || this.getCodeMirrorSelectionClientRect() + || this.getFocusedElementClientRect(); + } + + getNativeSelectionClientRect() { + const selection = document.getSelection?.(); + if (!selection || selection.rangeCount === 0 || selection.isCollapsed) { + return null; + } + const activeViewContainer = this.app.workspace.activeLeaf?.view?.containerEl; + const rects = []; + for (let index = 0; index < selection.rangeCount; index += 1) { + const range = selection.getRangeAt(index); + if ( + activeViewContainer + && range.commonAncestorContainer + && !activeViewContainer.contains( + range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE + ? range.commonAncestorContainer + : range.commonAncestorContainer.parentElement + ) + ) { + continue; + } + rects.push(...Array.from(range.getClientRects())); + const boundingRect = range.getBoundingClientRect(); + if (isUsableClientRect(boundingRect)) { + rects.push(boundingRect); + } + } + return combineClientRects(rects); + } + + getCodeMirrorSelectionClientRect() { + const activeViewContainer = this.app.workspace.activeLeaf?.view?.containerEl; + if (!activeViewContainer) { + return null; + } + return combineClientRects( + Array.from(activeViewContainer.querySelectorAll(".cm-selectionBackground")) + .map((element) => element.getBoundingClientRect()) + ); + } + + getFocusedElementClientRect() { + const activeViewContainer = this.app.workspace.activeLeaf?.view?.containerEl; + const activeElement = document.activeElement; + if (!activeViewContainer || !activeElement || !activeViewContainer.contains(activeElement)) { + return null; + } + const rect = activeElement.getBoundingClientRect(); + return isUsableClientRect(rect) ? rect : null; + } + + resetVaultPetPosition() { + if (!this.uiState) { + return; + } + this.uiState.vaultPetState = {}; + if (!this.vaultPet && this.isVaultPetEnabled()) { + this.configureVaultPet(); + } + this.vaultPet?.resetPosition(); + } + + handleVaultPetActivity(kind, file) { + if (!this.isVaultPetEnabled()) { + return; + } + this.vaultPet?.handleVaultActivity(kind, file); + } + + handleVaultPetWorkspaceChange() { + if (!this.isVaultPetEnabled()) { + return; + } + this.vaultPet?.handleWorkspaceChange(); + } + + ensureCanvasPopupMenuPatches() { + this.app.workspace.getLeavesOfType("canvas").forEach((leaf) => { + this.ensureCanvasPopupMenuPatched(leaf?.view); + }); + } + + ensureCanvasSelectionTrackingPatches() { + this.app.workspace.getLeavesOfType("canvas").forEach((leaf) => { + this.ensureCanvasSelectionTrackingPatched(leaf?.view); + }); + } + + ensureCanvasSelectionTrackingPatched(view) { + const canvas = view?.canvas; + if (!canvas || typeof canvas !== "object") { + return false; + } + + if (canvas[CANVAS_SELECTION_TRACKING_PATCH_SYMBOL]) { + return true; + } + + const unpatches = []; + const scheduleCapture = () => { + this.scheduleCanvasSelectionSnapshotCapture(view); + }; + const patchTargetMethod = (target, methodName) => { + const unpatch = patchObjectMethod(target, methodName, (original) => { + return function patchedCanvasSelectionMethod(...args) { + const result = original.apply(this, args); + scheduleCapture(); + return result; + }; + }); + if (!unpatch) { + return false; + } + + unpatches.push(unpatch); + return true; + }; + + let patched = false; + [ + [canvas, "updateSelection"], + [canvas, "selectOnly"], + [canvas, "deselectAll"], + [canvas?.selectionManager, "updateSelection"], + [canvas?.selectionManager, "select"], + [canvas?.selectionManager, "selectOnly"], + [canvas?.selectionManager, "deselectAll"], + [canvas?.selectionManager, "clear"], + [canvas?.selectionManager, "setSelection"], + ].forEach(([target, methodName]) => { + patched = patchTargetMethod(target, methodName) || patched; + }); + + if (!patched) { + return false; + } + + const cleanup = () => { + unpatches.splice(0).reverse().forEach((unpatch) => { + try { + unpatch(); + } catch { + // Ignore cleanup failures during plugin unload or hot reload. + } + }); + delete canvas[CANVAS_SELECTION_TRACKING_PATCH_SYMBOL]; + }; + + canvas[CANVAS_SELECTION_TRACKING_PATCH_SYMBOL] = true; + this.register(cleanup); + return true; + } + + ensureCanvasPopupMenuPatched(view) { + const menu = view?.canvas?.menu; + if (!menu || typeof menu.render !== "function") { + return false; + } + + if (this.canvasPopupMenuPatchStateByMenu.has(menu)) { + this.syncCanvasPopupActionButtons(view); + return true; + } + + const originalRender = menu.render.bind(menu); + menu.render = (...args) => { + const result = originalRender(...args); + queueMicrotask(() => { + this.syncCanvasPopupActionButtons(view); + }); + return result; + }; + + this.canvasPopupMenuPatchStateByMenu.set(menu, originalRender); + this.syncCanvasPopupActionButtons(view); + return true; + } + + restoreCanvasPopupMenuPatches() { + this.canvasPopupMenuPatchStateByMenu.forEach((originalRender, menu) => { + if (menu && typeof originalRender === "function") { + menu.render = originalRender; + } + }); + this.canvasPopupMenuPatchStateByMenu.clear(); + } + + syncCanvasPopupActionButtons(view) { + const menuEl = view?.canvas?.menu?.menuEl; + if (!menuEl) { + return false; + } + + const selectedNodeIds = this.resolver.extractSelectedNodeIds(view); + const shouldShow = selectedNodeIds.length === 1; + const selectedCanvasPath = String(view?.file?.path || this.app.workspace.getActiveFile()?.path || "").trim(); + const selectedNode = shouldShow && selectedCanvasPath + ? this.getCanvasSnapshotSync(selectedCanvasPath)?.nodeById?.get(String(selectedNodeIds[0] || "").trim()) || null + : null; + const shouldShowFork = shouldShow && isOpenAgentAssistantResultNode(selectedNode); + const existingNewThreadButton = menuEl.querySelector(`#${CANVAS_NEW_THREAD_BUTTON_ID}`); + const existingFollowUpButton = menuEl.querySelector(`#${CANVAS_FOLLOW_UP_NODE_BUTTON_ID}`); + const existingForkButton = menuEl.querySelector(`#${CANVAS_FORK_NODE_BUTTON_ID}`); + + if (!shouldShow) { + existingNewThreadButton?.remove(); + existingFollowUpButton?.remove(); + existingForkButton?.remove(); + return false; + } + + if (!shouldShowFork) { + existingForkButton?.remove(); + } + + if (!existingNewThreadButton) { + const newThreadButton = document.createElement("button"); + newThreadButton.id = CANVAS_NEW_THREAD_BUTTON_ID; + newThreadButton.classList.add("clickable-icon"); + newThreadButton.setAttribute("type", "button"); + newThreadButton.setAttribute("aria-label", "New thread"); + setIcon(newThreadButton, "play"); + setTooltip(newThreadButton, "New thread", { placement: "top" }); + newThreadButton.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + void this.handleNewThreadFromSelectionCommand(); + }); + + menuEl.appendChild(newThreadButton); + } + + if (!existingFollowUpButton) { + const followUpButton = document.createElement("button"); + followUpButton.id = CANVAS_FOLLOW_UP_NODE_BUTTON_ID; + followUpButton.classList.add("clickable-icon"); + followUpButton.setAttribute("type", "button"); + followUpButton.setAttribute("aria-label", "Create follow-up node"); + setIcon(followUpButton, "message-square"); + setTooltip(followUpButton, "Create follow-up node", { placement: "top" }); + followUpButton.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + void this.handleCreateFollowUpNodeCommand(); + }); + + menuEl.appendChild(followUpButton); + } + + if (shouldShowFork && !existingForkButton) { + const forkButton = document.createElement("button"); + forkButton.id = CANVAS_FORK_NODE_BUTTON_ID; + forkButton.classList.add("clickable-icon"); + forkButton.setAttribute("type", "button"); + forkButton.setAttribute("aria-label", "Create fork node"); + setIcon(forkButton, "git-fork"); + setTooltip(forkButton, "Create fork node", { placement: "top" }); + forkButton.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + void this.handleCreateForkNodeCommand(); + }); + + if (existingFollowUpButton?.nextSibling) { + menuEl.insertBefore(forkButton, existingFollowUpButton.nextSibling); + } else { + menuEl.appendChild(forkButton); + } + } + + return true; + } + + getSelectedSandboxMode() { + return normalizeDaemonSandboxMode(this.settings?.daemonSandboxMode); + } + + buildRuntimeConfigPayload(overrides = {}) { + return { + approvalPolicy: "never", + sandboxMode: normalizeDaemonSandboxMode(overrides?.sandboxMode || this.getSelectedSandboxMode()), + }; + } + + describeRuntimeConfig(runtimeConfig) { + const sandboxMode = normalizeDaemonSandboxMode(runtimeConfig?.sandboxMode || this.getSelectedSandboxMode()); + const label = getDaemonSandboxModeLabel(sandboxMode); + return sandboxMode === DAEMON_SANDBOX_MODE_OPTIONS.DANGER_FULL_ACCESS + ? `${label} - can access files outside the selected folder` + : `${label} - limited to the selected folder`; + } + + getPluginLogoDataUrl() { + return this.logoDataUrl; + } + + getVaultPetMascotDataUrl() { + if (this.vaultPetMascotDataUrl) { + return this.vaultPetMascotDataUrl; + } + + const mascotPath = this.getVaultPetMascotPath(); + if (!mascotPath) { + return DEFAULT_VAULT_PET_MASCOT_DATA_URL || this.getPluginLogoDataUrl(); + } + + try { + this.vaultPetMascotDataUrl = `data:image/png;base64,${fs.readFileSync(mascotPath).toString("base64")}`; + return this.vaultPetMascotDataUrl; + } catch { + return DEFAULT_VAULT_PET_MASCOT_DATA_URL || this.getPluginLogoDataUrl(); + } + } + + getVaultPetMascotPath() { + const candidatePaths = [ + this.getManifestPluginPath(VAULT_PET_MASCOT_FILE_NAME), + VAULT_PET_MASCOT_PATH, + ].filter(Boolean); + + return candidatePaths.find((candidatePath) => fs.existsSync(candidatePath)) || ""; + } + + async ensurePluginLogoDataUrlLoaded() { + if (this.logoDataUrl) { + return this.logoDataUrl; + } + + if (this.logoLoadPromise) { + return this.logoLoadPromise; + } + + const logoPath = this.getPluginLogoPath(); + if (!logoPath) { + this.logoDataUrl = DEFAULT_PLUGIN_LOGO_DATA_URL; + return this.logoDataUrl; + } + + this.logoLoadPromise = fs.promises.readFile(logoPath) + .then((buffer) => { + this.logoDataUrl = `data:image/png;base64,${buffer.toString("base64")}`; + this.requestViewRefresh(); + return this.logoDataUrl; + }) + .catch(() => DEFAULT_PLUGIN_LOGO_DATA_URL) + .finally(() => { + this.logoLoadPromise = null; + }); + + return this.logoLoadPromise; + } + + getPluginLogoPath() { + const candidatePaths = [ + this.getManifestPluginPath(PLUGIN_LOGO_FILE_NAME), + PLUGIN_LOGO_PATH, + ].filter(Boolean); + + return candidatePaths.find((candidatePath) => fs.existsSync(candidatePath)) || ""; + } + + getManifestPluginPath(fileName) { + const manifestDir = String(this.manifest?.dir || "").trim(); + if (!manifestDir) { + return ""; + } + + const adapter = this.app.vault?.adapter; + if (typeof adapter?.getBasePath !== "function") { + return ""; + } + + return path.join(adapter.getBasePath(), manifestDir, fileName); + } + + refreshSettingTab() { + if (!this.settingTab?.containerEl?.isConnected || typeof this.settingTab.display !== "function") { + return; + } + + this.settingTab.display(); + } + + getStoredDaemonConfigSummary() { + try { + if (!fs.existsSync(DAEMON_CONFIG_PATH)) { + return { + host: "", + port: "", + }; + } + + const parsed = JSON.parse(fs.readFileSync(DAEMON_CONFIG_PATH, "utf8")); + return { + host: String(parsed?.host || "").trim(), + port: String(parsed?.port || "").trim(), + }; + } catch { + return { + host: "", + port: "", + }; + } + } + + updateDaemonStatus(nextStatus, options = {}) { + const previousStatus = this.daemonStatus || createDaemonStatusSnapshot(); + const normalizedStatus = createDaemonStatusSnapshot(nextStatus); + const didChange = [ + "state", + "host", + "port", + "error", + "runtimeAvailable", + "runtimeMessage", + "lastRuntimeError", + ].some((key) => previousStatus[key] !== normalizedStatus[key]); + this.daemonStatus = normalizedStatus; + + if (didChange || options.forceRefresh === true) { + this.requestViewRefresh(); + this.refreshSettingTab(); + } + } + + getDaemonStatus() { + return this.daemonStatus || createDaemonStatusSnapshot(); + } + + getDaemonStatusLabel() { + const state = this.getDaemonStatus().state; + if (state === DAEMON_CONNECTION_STATES.ONLINE) { + return "Online"; + } + if (state === DAEMON_CONNECTION_STATES.OFFLINE) { + return "Offline"; + } + if (state === DAEMON_CONNECTION_STATES.CHECKING) { + return "Checking..."; + } + return "Unknown"; + } + + getDaemonStatusTagClassName() { + return getDaemonStatusTagClassName(this.getDaemonStatus().state); + } + + getDaemonStatusDetail() { + const status = this.getDaemonStatus(); + if (status.state === DAEMON_CONNECTION_STATES.ONLINE) { + if (status.runtimeAvailable === false) { + return status.runtimeMessage || "Connected, but Codex runtime needs attention."; + } + return "Connected to local Codex server."; + } + if (status.state === DAEMON_CONNECTION_STATES.OFFLINE) { + return formatDaemonStatusError(status.error); + } + if (status.state === DAEMON_CONNECTION_STATES.CHECKING) { + return "Checking local Codex server..."; + } + return "Status has not been checked yet."; + } + + async refreshDaemonStatus(options = {}) { + if (this.daemonStatusRefreshPromise) { + if (options.forceRefresh === true) { + this.requestViewRefresh(); + this.refreshSettingTab(); + } + return this.daemonStatusRefreshPromise; + } + + const storedConfig = this.getStoredDaemonConfigSummary(); + if (options.silent !== true) { + this.updateDaemonStatus({ + ...this.getDaemonStatus(), + ...storedConfig, + state: DAEMON_CONNECTION_STATES.CHECKING, + error: "", + }, { + forceRefresh: true, + }); + } + + this.daemonStatusRefreshPromise = this.api.getHealthOnce({ + reloadConfig: true, + }) + .then((health) => { + this.updateDaemonStatus({ + state: DAEMON_CONNECTION_STATES.ONLINE, + checkedAt: Date.now(), + host: String(health?.daemon?.host || storedConfig.host || "").trim(), + port: String(health?.daemon?.port || storedConfig.port || "").trim(), + error: "", + runtimeAvailable: typeof health?.runtime?.ok === "boolean" ? health.runtime.ok : null, + runtimeMessage: String(health?.runtime?.message || "").trim(), + lastRuntimeError: String(health?.lastRuntimeError || "").trim(), + }, { + forceRefresh: options.forceRefresh === true, + }); + return this.getDaemonStatus(); + }) + .catch((error) => { + this.updateDaemonStatus({ + state: DAEMON_CONNECTION_STATES.OFFLINE, + checkedAt: Date.now(), + host: storedConfig.host, + port: storedConfig.port, + error: String(error?.message || error), + runtimeAvailable: null, + runtimeMessage: "", + lastRuntimeError: "", + }, { + forceRefresh: options.forceRefresh === true || options.silent !== true, + }); + return this.getDaemonStatus(); + }) + .finally(() => { + this.daemonStatusRefreshPromise = null; + }); + + return this.daemonStatusRefreshPromise; + } + + async startDaemonWithFeedback() { + try { + await this.daemonLauncher.ensureStarted(); + this.runtimeIssue = ""; + await this.refreshDaemonStatus({ + silent: false, + forceRefresh: true, + }); + new Notice("Codex server is running."); + return true; + } catch (error) { + this.runtimeIssue = String(error?.message || error); + await this.refreshDaemonStatus({ + silent: false, + forceRefresh: true, + }).catch(() => {}); + new Notice(this.runtimeIssue); + this.requestViewRefresh(); + this.refreshSettingTab(); + return false; + } + } + + async pickDirectoryPath(options = {}) { + const defaultPath = normalizeRepoPath(options.defaultPath) || os.homedir(); + const title = String(options.title || "Choose folder"); + const candidates = []; + + try { + const electron = require("electron"); + if (electron?.remote?.dialog) { + candidates.push(electron.remote.dialog); + } + } catch { + // Ignore unavailable electron remote module. + } + + try { + const remote = require("@electron/remote"); + if (remote?.dialog) { + candidates.push(remote.dialog); + } + } catch { + // Ignore unavailable @electron/remote module. + } + + for (const dialog of candidates) { + if (typeof dialog?.showOpenDialogSync === "function") { + const filePaths = dialog.showOpenDialogSync({ + title, + defaultPath, + properties: ["openDirectory", "createDirectory"], + }); + if (Array.isArray(filePaths) && filePaths[0]) { + return normalizeRepoPath(filePaths[0]); + } + } + + if (typeof dialog?.showOpenDialog === "function") { + const result = await dialog.showOpenDialog({ + title, + defaultPath, + properties: ["openDirectory", "createDirectory"], + }); + if (result && !result.canceled && Array.isArray(result.filePaths) && result.filePaths[0]) { + return normalizeRepoPath(result.filePaths[0]); + } + } + } + + throw new Error("Folder picker is not available in this Obsidian runtime yet. Paste the repo path for now."); + } + + showWorkspacePicker() { + new WorkspacePickerModal(this.app, this).open(); + } + + getVaultBasePath() { + return this.resolver?.getVaultBasePath?.() || ""; + } + + getVaultScope() { + const vaultId = String(this.vaultId || "").trim(); + const vaultBasePath = this.getVaultBasePath(); + return { + scopeType: "obsidian-vault", + vaultId, + vaultName: String(this.app.vault?.getName?.() || "").trim(), + vaultPathHash: vaultBasePath ? stableShortHash(path.resolve(vaultBasePath)) : "", + }; + } + + withVaultScope(payload = {}) { + const vaultScope = this.getVaultScope(); + return { + ...payload, + vaultScope, + vaultId: vaultScope.vaultId, + vaultName: vaultScope.vaultName, + vaultPathHash: vaultScope.vaultPathHash, + }; + } + + isTaskForCurrentVault(task) { + const currentVaultId = String(this.vaultId || "").trim(); + if (!currentVaultId) { + return false; + } + + return this.getTaskVaultId(task) === currentVaultId; + } + + getTaskVaultId(task) { + return String(task?.vaultScope?.vaultId || task?.selectionContext?.vaultId || "").trim(); + } + + scopeTaskForCurrentVault(task) { + if (!task) { + return null; + } + + const scopedSelectionContext = task.selectionContext + ? this.withVaultScope(task.selectionContext) + : task.selectionContext; + const scopedTask = this.withVaultScope({ + ...task, + selectionContext: scopedSelectionContext, + }); + return scopedTask; + } + + getVaultPathForAbsolutePath(absolutePath) { + const normalizedAbsolutePath = String(absolutePath || "").trim(); + const vaultBasePath = this.getVaultBasePath(); + if (!normalizedAbsolutePath || !path.isAbsolute(normalizedAbsolutePath) || !vaultBasePath) { + return ""; + } + + const targetPath = normalizeFilesystemPathForCompare(normalizedAbsolutePath); + const normalizedVaultBasePath = normalizeFilesystemPathForCompare(vaultBasePath); + if (targetPath === normalizedVaultBasePath || targetPath.startsWith(`${normalizedVaultBasePath}/`)) { + const directVaultPath = normalizePromptPath(path.relative(vaultBasePath, normalizedAbsolutePath)); + const directFile = this.app.vault.getAbstractFileByPath(directVaultPath); + if (directFile instanceof TFile) { + return directFile.path; + } + } + + const targetRealpath = safeRealpathSync(normalizedAbsolutePath); + const targetComparablePath = targetRealpath + ? normalizeFilesystemPathForCompare(targetRealpath) + : targetPath; + + for (const file of this.app.vault.getFiles()) { + const fileAbsolutePath = this.getVaultAbsolutePath(file.path); + if (!fileAbsolutePath) { + continue; + } + + const fileRealpath = safeRealpathSync(fileAbsolutePath); + const fileComparablePath = fileRealpath + ? normalizeFilesystemPathForCompare(fileRealpath) + : normalizeFilesystemPathForCompare(fileAbsolutePath); + if (fileComparablePath === targetComparablePath) { + return file.path; + } + } + + return ""; + } + + normalizeAssistantLinksForObsidian(text) { + return rewriteMarkdownLinks(text, (rawTarget) => { + const parsed = parseLocalMarkdownLinkTarget(rawTarget); + if (!parsed) { + return ""; + } + + const vaultPath = this.getVaultPathForAbsolutePath(parsed.localPath); + if (vaultPath) { + return `${encodeMarkdownLinkPath(vaultPath)}${parsed.fragment || ""}`; + } + + return pathToFileURL(parsed.localPath).href; + }); + } + + getVaultAbsolutePath(vaultPath) { + const vaultBasePath = this.getVaultBasePath(); + if (!vaultBasePath) { + return ""; + } + return path.join(vaultBasePath, String(vaultPath || "").replace(/^\/+|\/+$/g, "")); + } + + getWorkspaceRootVaultPath() { + return String(this.settings.workspaceRoot || DEFAULT_SETTINGS.workspaceRoot).trim() || DEFAULT_SETTINGS.workspaceRoot; + } + + getRepoWorkspaceDirectory(repoPath) { + return path.join(repoPath, REPO_WORKSPACE_DIR_NAME); + } + + getWorkspaceConfigFiles() { + const workspaceRoot = this.getWorkspaceRootVaultPath(); + return this.app.vault.getFiles().filter((file) => { + return basenameVaultPath(file.path) === WORKSPACE_CONFIG_FILE_NAME + && isVaultPathWithinRoot(file.path, workspaceRoot); + }); + } + + isWorkspaceSummariesLoading() { + return Boolean(this.workspaceSummariesLoadPromise); + } + + getWorkspaceSummarySignature(workspace) { + if (!workspace) { + return ""; + } + + return [ + workspace.configPath, + workspace.folderPath, + workspace.name, + workspace.repoPath, + workspace.defaultCanvas, + ].join("|"); + } + + haveWorkspaceSummariesChanged(nextMap) { + const previousMap = this.workspaceSummaryCacheByConfigPath; + if (previousMap.size !== nextMap.size) { + return true; + } + + for (const [configPath, nextSummary] of nextMap.entries()) { + if (this.getWorkspaceSummarySignature(previousMap.get(configPath)) !== this.getWorkspaceSummarySignature(nextSummary)) { + return true; + } + } + + return false; + } + + async readWorkspaceConfigSummary(file) { + if (!(file instanceof TFile) || basenameVaultPath(file.path) !== WORKSPACE_CONFIG_FILE_NAME) { + return null; + } + + try { + const parsed = JSON.parse(await this.app.vault.cachedRead(file)); + const repoPath = normalizeRepoPath(parsed?.repoPath); + if (!repoPath) { + return null; + } + + return { + configPath: file.path, + folderPath: dirnameVaultPath(file.path), + name: String(parsed?.name || basenameVaultPath(dirnameVaultPath(file.path)) || "Workspace").trim(), + repoPath, + defaultCanvas: String(parsed?.defaultCanvas || DEFAULT_WORKSPACE_CANVAS_FILE).trim() || DEFAULT_WORKSPACE_CANVAS_FILE, + }; + } catch { + return null; + } + } + + async ensureWorkspaceSummariesLoaded(options = {}) { + const force = options.force === true; + if (!force && this.workspaceSummariesLoaded) { + return this.listWorkspaceSummaries(); + } + + if (!force && this.workspaceSummariesLoadPromise) { + return this.workspaceSummariesLoadPromise; + } + + this.workspaceSummariesLoadPromise = (async () => { + const nextMap = new Map(); + const summaries = await Promise.all(this.getWorkspaceConfigFiles().map((file) => this.readWorkspaceConfigSummary(file))); + summaries.filter(Boolean).forEach((summary) => { + nextMap.set(summary.configPath, summary); + }); + + const changed = this.haveWorkspaceSummariesChanged(nextMap); + this.workspaceSummaryCacheByConfigPath = nextMap; + this.workspaceSummariesLoaded = true; + if (changed || force) { + this.requestViewRefresh(); + } + + return this.listWorkspaceSummaries(); + })().finally(() => { + this.workspaceSummariesLoadPromise = null; + }); + + return this.workspaceSummariesLoadPromise; + } + + handleWorkspaceConfigMutation(file, oldPath = "") { + const nextPath = file instanceof TFile ? String(file.path || "").trim() : ""; + const normalizedOldPath = String(oldPath || "").trim(); + const workspaceRoot = this.getWorkspaceRootVaultPath(); + if (basenameVaultPath(nextPath) !== WORKSPACE_CONFIG_FILE_NAME && basenameVaultPath(normalizedOldPath) !== WORKSPACE_CONFIG_FILE_NAME) { + return; + } + if (!isVaultPathWithinRoot(nextPath, workspaceRoot) && !isVaultPathWithinRoot(normalizedOldPath, workspaceRoot)) { + return; + } + + this.workspaceSummariesLoaded = false; + void this.ensureWorkspaceSummariesLoaded({ force: true }); + } + + getAutomationFolderVaultPaths() { + const roots = []; + this.listWorkspaceSummaries().forEach((workspace) => { + if (workspace?.folderPath) { + roots.push(joinVaultPath(workspace.folderPath, WORKSPACE_AUTOMATION_DIR_NAME)); + } + }); + const customFolder = String(this.settings.automationFolder || "").trim(); + if (customFolder) { + roots.push(customFolder); + } + return Array.from(new Set(roots.filter(Boolean))); + } + + isAutomationFilePath(vaultPath) { + const normalizedPath = String(vaultPath || "").trim(); + return normalizedPath.endsWith(".md") + && this.getAutomationFolderVaultPaths().some((automationFolder) => isVaultPathWithinRoot(normalizedPath, automationFolder)); + } + + getAutomationFiles() { + return this.app.vault.getFiles().filter((file) => this.isAutomationFilePath(file.path)); + } + + async ensureDefaultAutomationFile() { + await this.ensureWorkspaceSummariesLoaded(); + const activeWorkspace = this.getActiveWorkspace(); + const workspace = activeWorkspace + || this.listWorkspaceSummaries().find((summary) => summary.name === "openagent") + || this.listWorkspaceSummaries()[0] + || null; + const automationFolder = workspace?.folderPath + ? joinVaultPath(workspace.folderPath, WORKSPACE_AUTOMATION_DIR_NAME) + : (String(this.settings.automationFolder || "").trim() || joinVaultPath(this.getWorkspaceRootVaultPath(), "openagent", WORKSPACE_AUTOMATION_DIR_NAME)); + await this.ensureVaultFolderExists(automationFolder); + const automationPath = joinVaultPath(automationFolder, DEFAULT_DAILY_VAULT_REVIEW_AUTOMATION_FILE); + if (this.app.vault.getAbstractFileByPath(automationPath)) { + return; + } + + await this.writeVaultFile(automationPath, [ + "---", + "openagent: automation", + "id: daily-vault-review", + "enabled: true", + "schedule: \"0 18 * * *\"", + `cwd: "${DEFAULT_DAILY_VAULT_REVIEW_CWD}"`, + "threadStrategy: resume", + "approvalPolicy: never", + "sandboxMode: workspace-write", + "---", + "", + "Use the Codex skill [[Codex Skills/daily-vault-review/SKILL|daily-vault-review]] to create or update today's daily review note.", + "", + "Run the normal daily vault review workflow for /Users/applefather/Documents/Applefather.", + "", + ].join("\n")); + } + + async readAutomationDefinition(file) { + if (!(file instanceof TFile) || !this.isAutomationFilePath(file.path)) { + return null; + } + + const raw = await this.app.vault.cachedRead(file); + const parsed = parseAutomationFrontmatter(raw); + if (String(parsed.data.openagent || "").trim() !== "automation") { + return null; + } + + const cwd = String(parsed.data.cwd || "").trim(); + const prompt = String(parsed.body || "").trim(); + const id = String(parsed.data.id || basenameVaultPath(file.path).replace(/\.md$/i, "")).trim(); + return { + id, + sourcePath: file.path, + title: String(parsed.data.title || basenameVaultPath(file.path).replace(/\.md$/i, "")).trim(), + enabled: parsed.data.enabled !== false, + schedule: String(parsed.data.schedule || "manual").trim() || "manual", + cwd, + prompt, + threadStrategy: String(parsed.data.threadStrategy || "resume").trim() === "new" ? "new" : "resume", + runtimeConfig: { + approvalPolicy: String(parsed.data.approvalPolicy || "never").trim(), + sandboxMode: normalizeDaemonSandboxMode(parsed.data.sandboxMode || this.getSelectedSandboxMode()), + }, + }; + } + + async readAutomationDefinitions() { + const definitions = await Promise.all(this.getAutomationFiles().map((file) => this.readAutomationDefinition(file))); + return definitions.filter(Boolean); + } + + scheduleAutomationSync() { + window.clearTimeout(this.automationSyncTimer); + this.automationSyncTimer = window.setTimeout(() => { + this.automationSyncTimer = null; + void this.syncAutomationsToDaemon().catch(() => {}); + }, 750); + } + + handleAutomationFileMutation(file, oldPath = "") { + const nextPath = file instanceof TFile ? String(file.path || "").trim() : ""; + const previousPath = String(oldPath || "").trim(); + if (!this.isAutomationFilePath(nextPath) && !this.isAutomationFilePath(previousPath)) { + return; + } + + this.scheduleAutomationSync(); + } + + async syncAutomationsToDaemon() { + if (this.automationSyncPromise) { + return this.automationSyncPromise; + } + + this.automationSyncPromise = (async () => { + const automations = await this.readAutomationDefinitions(); + await this.api.syncAutomations({ + source: this.getAutomationSyncSource(), + pruneMissing: true, + automations, + }); + return automations; + })().finally(() => { + this.automationSyncPromise = null; + }); + + return this.automationSyncPromise; + } + + getAutomationSyncSource() { + const basePath = String(this.app.vault.adapter?.basePath || "").trim(); + return basePath ? `vault:${basePath}` : "vault"; + } + + async syncAutomationsWithFeedback() { + try { + await this.ensureDefaultAutomationFile(); + const automations = await this.syncAutomationsToDaemon(); + new Notice(`Synced ${automations.length} OpenAgent automation${automations.length === 1 ? "" : "s"}.`); + } catch (error) { + new Notice(`Automation sync failed: ${String(error?.message || error)}`); + } + } + + async runAutomationWithFeedback(automationId) { + try { + await this.ensureDefaultAutomationFile(); + await this.syncAutomationsToDaemon(); + await this.api.runAutomation(automationId, { force: true }); + new Notice("Daily vault review automation started."); + } catch (error) { + new Notice(`Automation run failed: ${String(error?.message || error)}`); + } + } + + listWorkspaceSummaries() { + return Array.from(this.workspaceSummaryCacheByConfigPath.values()) + .sort((left, right) => left.name.localeCompare(right.name)); + } + + getWorkspaceForVaultPath(vaultPath) { + const normalizedPath = String(vaultPath || "").trim(); + if (!normalizedPath) { + return null; + } + + return this.listWorkspaceSummaries().find((workspace) => { + return normalizedPath === workspace.folderPath || normalizedPath.startsWith(`${workspace.folderPath}/`); + }) || null; + } + + getActiveWorkspace() { + const activeCanvasPath = this.getActiveCanvasPath(); + if (!activeCanvasPath) { + return null; + } + + return this.getWorkspaceForVaultPath(activeCanvasPath); + } + + resolveWorkspaceRepoPathForSelection(selection) { + const workspace = this.getWorkspaceForVaultPath(selection?.canvasPath); + return workspace?.repoPath || ""; + } + + async ensureVaultFolderExists(vaultFolderPath) { + const parts = String(vaultFolderPath || "").split("/").filter(Boolean); + let currentPath = ""; + + for (const part of parts) { + currentPath = joinVaultPath(currentPath, part); + if (!this.app.vault.getAbstractFileByPath(currentPath)) { + await this.app.vault.createFolder(currentPath); + } + } + } + + ensureFilesystemFolderExists(folderPath) { + fs.mkdirSync(folderPath, { recursive: true }); + } + + writeFilesystemFile(filePath, content) { + this.ensureFilesystemFolderExists(path.dirname(filePath)); + fs.writeFileSync(filePath, content, "utf8"); + } + + async writeVaultFile(vaultPath, content) { + const existing = this.app.vault.getAbstractFileByPath(vaultPath); + if (existing instanceof TFile) { + await this.app.vault.modify(existing, content); + return existing; + } + + return this.app.vault.create(vaultPath, content); + } + + buildDefaultWorkspaceCanvas(name, repoPath) { + return JSON.stringify({ + nodes: [ + { + id: "workspace-intro", + type: "text", + x: 80, + y: 80, + width: 440, + height: 280, + text: [ + `Workspace: ${name}`, + `Repo: ${repoPath}`, + "", + "- One text node = one prompt/thread", + "- Run: OpenAgent: New thread from selection", + "- Shortcut helper: OpenAgent: Create follow-up node", + "- Optional context: markdown file nodes, or markdown files in the same group", + "- Follow-up: create a follow-up node from a previous OpenAgent node, then run again", + "- OpenAgent writes the answer back to the canvas", + ].join("\n"), + }, + ], + edges: [], + }, null, 2) + "\n"; + } + + readRepoWorkspaceConfig(repoWorkspaceDir) { + const configPath = path.join(repoWorkspaceDir, WORKSPACE_CONFIG_FILE_NAME); + if (!fs.existsSync(configPath)) { + return null; + } + try { + const parsed = JSON.parse(fs.readFileSync(configPath, "utf8")); + const repoPath = normalizeRepoPath(parsed?.repoPath); + if (!repoPath) { + return null; + } + return { + configPath, + folderPath: repoWorkspaceDir, + name: String(parsed?.name || path.basename(repoPath) || "Workspace").trim() || "Workspace", + repoPath, + defaultCanvas: String(parsed?.defaultCanvas || DEFAULT_WORKSPACE_CANVAS_FILE).trim() || DEFAULT_WORKSPACE_CANVAS_FILE, + }; + } catch { + return null; + } + } + + ensureRepoWorkspaceFiles(repoPath, workspaceNameInput = "") { + const repoWorkspaceDir = this.getRepoWorkspaceDirectory(repoPath); + this.ensureFilesystemFolderExists(repoWorkspaceDir); + + const existing = this.readRepoWorkspaceConfig(repoWorkspaceDir); + const workspaceName = String(existing?.name || workspaceNameInput || path.basename(repoPath)).trim() || path.basename(repoPath); + const defaultCanvas = String(existing?.defaultCanvas || DEFAULT_WORKSPACE_CANVAS_FILE).trim() || DEFAULT_WORKSPACE_CANVAS_FILE; + const workspace = { + configPath: path.join(repoWorkspaceDir, WORKSPACE_CONFIG_FILE_NAME), + folderPath: repoWorkspaceDir, + name: workspaceName, + repoPath, + defaultCanvas, + }; + + if (!existing) { + this.writeFilesystemFile(workspace.configPath, JSON.stringify({ + name: workspace.name, + repoPath: workspace.repoPath, + defaultCanvas: workspace.defaultCanvas, + createdAt: new Date().toISOString(), + }, null, 2) + "\n"); + } + + const canvasPath = path.join(repoWorkspaceDir, workspace.defaultCanvas); + if (!fs.existsSync(canvasPath)) { + this.writeFilesystemFile(canvasPath, this.buildDefaultWorkspaceCanvas(workspace.name, workspace.repoPath)); + } + + return workspace; + } + + resolveVaultWorkspaceLink(folderName, repoWorkspaceDir) { + const workspaceRoot = this.getWorkspaceRootVaultPath(); + const repoWorkspaceRealPath = safeRealpathSync(repoWorkspaceDir) || path.normalize(repoWorkspaceDir); + let candidateFolderName = slugifyWorkspaceName(folderName); + let suffix = 2; + + while (candidateFolderName) { + const folderPath = joinVaultPath(workspaceRoot, candidateFolderName); + const linkPath = this.getVaultAbsolutePath(folderPath); + if (!linkPath) { + throw new Error("OpenAgent could not resolve the current vault path."); + } + + if (!pathExistsOrIsSymlink(linkPath)) { + return { folderPath, linkPath }; + } + + const existingTarget = safeRealpathSync(linkPath); + if (existingTarget && existingTarget === repoWorkspaceRealPath) { + return { folderPath, linkPath }; + } + + candidateFolderName = `${slugifyWorkspaceName(folderName)}-${suffix}`; + suffix += 1; + } + + throw new Error("OpenAgent could not allocate a workspace entry for this repo."); + } + + async ensureWorkspaceSymlink(repoWorkspaceDir, workspaceName) { + const workspaceRoot = this.getWorkspaceRootVaultPath(); + await this.ensureVaultFolderExists(workspaceRoot); + + const { folderPath, linkPath } = this.resolveVaultWorkspaceLink(workspaceName, repoWorkspaceDir); + if (!pathExistsOrIsSymlink(linkPath)) { + fs.symlinkSync(repoWorkspaceDir, linkPath, getDirectorySymlinkType()); + } + + return { folderPath, linkPath }; + } + + async waitForWorkspaceCanvasFile(vaultFolderPath, canvasFileName) { + const canvasPath = joinVaultPath(vaultFolderPath, canvasFileName); + const startedAt = Date.now(); + while (Date.now() - startedAt <= WORKSPACE_INDEX_WAIT_MS) { + const abstractFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (abstractFile instanceof TFile) { + return abstractFile; + } + await sleep(WORKSPACE_INDEX_POLL_MS); + } + return null; + } + + async createWorkspaceFromRepoPath(repoPathInput, workspaceNameInput = "") { + const repoPath = normalizeRepoPath(repoPathInput); + if (!repoPath) { + throw new Error("Enter an absolute repo path."); + } + if (!fs.existsSync(repoPath) || !fs.statSync(repoPath).isDirectory()) { + throw new Error(`Repo path does not exist: ${repoPath}`); + } + + await this.ensureWorkspaceSummariesLoaded(); + const existing = this.listWorkspaceSummaries().find((workspace) => workspace.repoPath === repoPath); + if (existing) { + await this.openWorkspace(existing); + new Notice(`Opened existing workspace: ${existing.name}`); + return existing; + } + + const repoWorkspace = this.ensureRepoWorkspaceFiles(repoPath, workspaceNameInput); + const { folderPath } = await this.ensureWorkspaceSymlink(repoWorkspace.folderPath, repoWorkspace.name); + const workspace = { + configPath: joinVaultPath(folderPath, WORKSPACE_CONFIG_FILE_NAME), + folderPath, + name: repoWorkspace.name, + repoPath: repoWorkspace.repoPath, + defaultCanvas: repoWorkspace.defaultCanvas, + }; + + const canvasFile = await this.waitForWorkspaceCanvasFile(workspace.folderPath, workspace.defaultCanvas); + if (!canvasFile) { + throw new Error(`OpenAgent created ${REPO_WORKSPACE_DIR_NAME}, but Obsidian has not indexed the new workspace link yet. Try reopening the workspace picker.`); + } + + await this.ensureWorkspaceSummariesLoaded({ force: true }); + await this.openWorkspace(workspace); + new Notice(`Created workspace: ${workspace.name}`); + return workspace; + } + + async ensureWorkspaceForRepoPath(repoPathInput, workspaceNameInput = "") { + const repoPath = normalizeRepoPath(repoPathInput); + if (!repoPath) { + throw new Error("OpenAgent could not infer a working directory for this chat."); + } + if (!fs.existsSync(repoPath) || !fs.statSync(repoPath).isDirectory()) { + throw new Error(`Working directory does not exist: ${repoPath}`); + } + + await this.ensureWorkspaceSummariesLoaded(); + const existing = this.listWorkspaceSummaries().find((workspace) => workspace.repoPath === repoPath); + if (existing) { + return existing; + } + + const repoWorkspace = this.ensureRepoWorkspaceFiles(repoPath, workspaceNameInput); + const { folderPath } = await this.ensureWorkspaceSymlink(repoWorkspace.folderPath, repoWorkspace.name); + const workspace = { + configPath: joinVaultPath(folderPath, WORKSPACE_CONFIG_FILE_NAME), + folderPath, + name: repoWorkspace.name, + repoPath: repoWorkspace.repoPath, + defaultCanvas: repoWorkspace.defaultCanvas, + }; + + const canvasFile = await this.waitForWorkspaceCanvasFile(workspace.folderPath, workspace.defaultCanvas); + if (!canvasFile) { + throw new Error(`OpenAgent created a workspace canvas, but Obsidian has not indexed it yet: ${workspace.defaultCanvas}`); + } + + await this.ensureWorkspaceSummariesLoaded({ force: true }); + return workspace; + } + + async openWorkspace(workspace) { + const canvasPath = joinVaultPath(workspace.folderPath, workspace.defaultCanvas || DEFAULT_WORKSPACE_CANVAS_FILE); + const canvasFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(canvasFile instanceof TFile)) { + throw new Error(`Default canvas not found: ${canvasPath}`); + } + + const leaf = this.app.workspace.getMostRecentLeaf() || this.app.workspace.getLeaf(true); + await leaf.openFile(canvasFile); + await this.activateView(); + await this.refreshTasks(); + } + + getDevSmokeAbsolutePath(relativePath) { + const vaultBasePath = this.getVaultBasePath(); + if (!vaultBasePath) { + return ""; + } + + return path.join(vaultBasePath, relativePath); + } + + isDevSmokePollingEnabled() { + return this.settings?.enableDevSmokeRequests === true; + } + + isDebugLoggingEnabled() { + return this.settings?.enableDebugLogging === true; + } + + configureDevSmokePolling() { + if (this.devSmokePollIntervalId != null) { + window.clearInterval(this.devSmokePollIntervalId); + this.devSmokePollIntervalId = null; + } + + if (!this.isDevSmokePollingEnabled()) { + void this.appendDebugEvent("dev_smoke_polling_configured", { + enabled: false, + requestPath: this.getDevSmokeAbsolutePath(DEV_SMOKE_REQUEST_RELATIVE_PATH), + }); + return; + } + + this.devSmokePollIntervalId = window.setInterval(() => { + this.maybeRunDevSmokeRequest(); + }, DEV_SMOKE_POLL_MS); + this.registerInterval(this.devSmokePollIntervalId); + void this.appendDebugEvent("dev_smoke_polling_configured", { + enabled: true, + pollMs: DEV_SMOKE_POLL_MS, + requestPath: this.getDevSmokeAbsolutePath(DEV_SMOKE_REQUEST_RELATIVE_PATH), + }); + this.maybeRunDevSmokeRequest(); + } + + maybeRunDevSmokeRequest() { + if (!this.isDevSmokePollingEnabled()) { + return; + } + + if (this.devSmokeRunPromise) { + return; + } + + this.devSmokeRunPromise = this.runDevSmokeRequest() + .catch(() => {}) + .finally(() => { + this.devSmokeRunPromise = null; + }); + } + + async runDevSmokeRequest() { + const requestPath = this.getDevSmokeAbsolutePath(DEV_SMOKE_REQUEST_RELATIVE_PATH); + if (!requestPath || !fs.existsSync(requestPath)) { + return; + } + + let request; + try { + request = JSON.parse(fs.readFileSync(requestPath, "utf8")); + } catch (error) { + fs.unlinkSync(requestPath); + await this.writeDevSmokeResult({ + status: "error", + requestId: "", + message: `Invalid smoke request: ${error.message}`, + finishedAt: new Date().toISOString(), + }); + return; + } + + const requestId = String(request?.id || "").trim() || `anonymous-${Date.now()}`; + if (requestId === this.lastProcessedSmokeRequestId) { + return; + } + this.lastProcessedSmokeRequestId = requestId; + void this.appendDebugEvent("dev_smoke_request_detected", { + requestId, + canvasPath: String(request?.canvasPath || ""), + mode: String(request?.mode || ""), + runTask: request?.runTask !== false, + forceNewTask: request?.forceNewTask === true, + }); + + try { + let selection = await this.resolveDevSmokeSelection(request); + const requestedCwd = this.normalizeWorkingDirectoryInput(request?.cwd); + const smokeMode = String(request?.mode || "").trim(); + let task = null; + let rawPrompt = ""; + let runMode = smokeMode || "default"; + + if (request?.runTask !== false && smokeMode === "new-thread" && request?.forceNewTask === true) { + selection = await this.resolver.addImplicitCanvasFileContext(selection); + const followUpResult = await this.runSelectionAsFollowUp(selection, { + confirmFork: async () => request?.forkBehavior === "fork" ? "fork" : "continue", + }); + if (followUpResult) { + if (followUpResult.cancelled) { + runMode = "cancelled"; + } else { + task = followUpResult.task; + rawPrompt = followUpResult.message; + runMode = followUpResult.mode || "follow-up"; + } + } + } + + if (!task) { + if (request?.forceNewTask === true) { + selection = await this.resolver.addImplicitCanvasFileContext(selection); + } + + const response = await this.api.createTaskFromCanvasSelection(this.withVaultScope({ + ...selection, + cwd: requestedCwd || this.resolver.inferWorkingDirectory(selection), + forceNewTask: request?.forceNewTask === true, + runtimeConfig: this.buildRuntimeConfigPayload(), + })); + task = this.mergeTask(response.task, { adoptCurrentVault: true }); + + if (request?.runTask !== false) { + if (smokeMode === "new-thread") { + rawPrompt = this.getNewThreadPromptFromSelection(selection, { + cwd: requestedCwd || this.resolver.inferWorkingDirectory(selection), + }); + const runResponse = await this.api.runTask(task.taskId, { + rawPrompt, + transcriptMessage: rawPrompt, + forceContext: false, + runtimeConfig: this.buildRuntimeConfigPayload(), + }); + this.mergeTask(runResponse.task, { adoptCurrentVault: true }); + } else { + const runResponse = await this.api.runTask(task.taskId, { + forceContext: true, + runtimeConfig: this.buildRuntimeConfigPayload(), + }); + this.mergeTask(runResponse.task, { adoptCurrentVault: true }); + } + } + } + + await this.refreshTask(task.taskId); + + await this.writeDevSmokeResult({ + status: "ok", + requestId, + taskId: task.taskId, + cwd: task.cwd || requestedCwd || "", + canvasPath: selection.canvasPath, + nodeIds: selection.nodeIds, + selectionSummary: this.summarizeSelection(selection), + selectionDebug: this.describeSelectionDebug(selection), + mode: runMode, + rawPrompt, + runTriggered: request?.runTask !== false, + finishedAt: new Date().toISOString(), + }); + } catch (error) { + await this.writeDevSmokeResult({ + status: "error", + requestId, + message: String(error?.message || error), + finishedAt: new Date().toISOString(), + }); + } finally { + if (fs.existsSync(requestPath)) { + fs.unlinkSync(requestPath); + } + } + } + + async resolveDevSmokeSelection(request) { + const canvasPath = String(request?.canvasPath || "").trim(); + if (!canvasPath) { + throw new Error("Smoke request is missing canvasPath."); + } + + const abstractFile = await this.waitForSmokeCanvasFile(canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + throw new Error(`Smoke canvas not found: ${canvasPath}`); + } + + const explicitNodeIds = Array.isArray(request?.nodeIds) + ? request.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + const nodeIds = explicitNodeIds.length > 0 + ? explicitNodeIds + : await this.resolveAllSupportedCanvasNodeIds(abstractFile); + + if (nodeIds.length === 0) { + throw new Error(`Smoke canvas has no supported nodes: ${canvasPath}`); + } + + return this.resolver.resolveCanvasSelection(abstractFile, nodeIds); + } + + async waitForSmokeCanvasFile(canvasPath, options = {}) { + const normalizedPath = String(canvasPath || "").trim(); + const timeoutMs = Math.max(0, toFiniteNumber(options.timeoutMs, 8_000)); + const pollMs = Math.max(25, toFiniteNumber(options.pollMs, 100)); + const deadline = Date.now() + timeoutMs; + + while (true) { + const abstractFile = this.app.vault.getAbstractFileByPath(normalizedPath); + if (!normalizedPath || abstractFile instanceof TFile) { + return abstractFile || null; + } + + if (Date.now() >= deadline) { + return abstractFile || null; + } + + await sleep(pollMs); + } + } + + async resolveAllSupportedCanvasNodeIds(file) { + const raw = await this.app.vault.cachedRead(file); + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + throw new Error(`Unable to parse canvas JSON for ${file.path}`); + } + + return Array.isArray(parsed?.nodes) + ? parsed.nodes + .filter((node) => node && (node.type === "text" || node.type === "file")) + .map((node) => String(node.id || "")) + .filter(Boolean) + : []; + } + + async writeDevSmokeResult(result) { + const resultPath = this.getDevSmokeAbsolutePath(DEV_SMOKE_RESULT_RELATIVE_PATH); + if (!resultPath) { + return; + } + + fs.mkdirSync(path.dirname(resultPath), { recursive: true }); + fs.writeFileSync(resultPath, `${JSON.stringify(result, null, 2)}\n`, "utf8"); + } + + getDebugLogAbsolutePath() { + return this.getDevSmokeAbsolutePath(DEBUG_LOG_RELATIVE_PATH); + } + + getRecentDebugEvents() { + return this.debugEvents.slice(-8).reverse(); + } + + async appendDebugEvent(type, payload = {}) { + if (!this.isDebugLoggingEnabled()) { + return null; + } + + const event = { + type: String(type || "event"), + createdAt: new Date().toISOString(), + payload, + summary: this.formatDebugSummary(payload), + }; + + this.debugEvents.push(event); + if (this.debugEvents.length > MAX_DEBUG_EVENTS) { + this.debugEvents = this.debugEvents.slice(-MAX_DEBUG_EVENTS); + } + + const debugPath = this.getDebugLogAbsolutePath(); + if (debugPath) { + fs.mkdirSync(path.dirname(debugPath), { recursive: true }); + fs.appendFileSync(debugPath, `${JSON.stringify(event)}\n`, "utf8"); + } + + this.requestViewRefresh(); + return event; + } + + formatDebugSummary(payload = {}) { + return Object.entries(payload) + .filter(([, value]) => value != null && value !== "") + .map(([key, value]) => `${key}=${this.truncateInline(typeof value === "string" ? value : JSON.stringify(value), 180)}`) + .join(" | "); + } + + getTasks() { + return Object.values(this.tasksById).filter((task) => this.isTaskForCurrentVault(task)).sort((left, right) => { + return (right.updatedAt || "").localeCompare(left.updatedAt || ""); + }); + } + + getTaskConversationLastMessageTimestamp(task) { + const messages = Array.isArray(task?.messages) ? task.messages : []; + const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null; + const lastMessageTimestamp = parseIsoTimestamp(lastMessage?.updatedAt || lastMessage?.createdAt || ""); + if (lastMessageTimestamp != null) { + return lastMessageTimestamp; + } + + if (String(task?.lastMessageRole || "") === "assistant") { + const latestAssistantTimestamp = parseIsoTimestamp( + task?.latestAssistantMessage?.updatedAt || task?.latestAssistantMessage?.createdAt || "" + ); + if (latestAssistantTimestamp != null) { + return latestAssistantTimestamp; + } + } + + return parseIsoTimestamp(task?.updatedAt || task?.createdAt || "") || 0; + } + + getTaskConversationLastMessageDayTimestamp(task) { + return getStartOfLocalDayTimestamp(this.getTaskConversationLastMessageTimestamp(task)); + } + + getTaskProjectLabel(task) { + const canvasWorkspace = this.getWorkspaceForVaultPath(task?.selectionContext?.canvasPath); + if (canvasWorkspace?.name) { + return canvasWorkspace.name; + } + + const cwd = normalizeRepoPath(task?.cwd); + if (!cwd) { + return ""; + } + + const cwdWorkspace = this.listWorkspaceSummaries().find((workspace) => { + return normalizeRepoPath(workspace?.repoPath) === cwd; + }); + return cwdWorkspace?.name || compactPathLabel(cwd); + } + + getTaskRootNodeRef(task) { + const canvasPath = this.getTaskCanvasPath(task); + const bindingRootNodeIds = Array.isArray(task?.canvasBinding?.rootNodeIds) + ? task.canvasBinding.rootNodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + const selectionNodeIds = Array.isArray(task?.selectionContext?.nodeIds) + ? task.selectionContext.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + const nodeIds = bindingRootNodeIds.length > 0 ? bindingRootNodeIds : selectionNodeIds; + if (!canvasPath || nodeIds.length === 0) { + return null; + } + + const rootNodeId = this.getConversationSelectionNodeIds(canvasPath, [nodeIds[0]])[0] || nodeIds[0]; + if (!rootNodeId) { + return null; + } + + return { + canvasPath, + nodeId: rootNodeId, + }; + } + + getTaskCanvasRunSourceRef(task) { + const bindingCanvasPath = String(task?.canvasBinding?.canvasPath || "").trim(); + const bindingNodeId = String(task?.canvasBinding?.activeSourceNodeId || "").trim(); + if (bindingCanvasPath && bindingNodeId) { + return { + canvasPath: bindingCanvasPath, + nodeId: bindingNodeId, + }; + } + + const taskId = String(task?.taskId || "").trim(); + const override = taskId ? this.canvasRunSourceRefByTaskId[taskId] : null; + const overrideCanvasPath = String(override?.canvasPath || "").trim(); + const overrideNodeId = String(override?.nodeId || "").trim(); + if (overrideCanvasPath && overrideNodeId) { + return { + canvasPath: overrideCanvasPath, + nodeId: overrideNodeId, + }; + } + + const canvasPath = String(task?.selectionContext?.canvasPath || "").trim(); + const nodeIds = Array.isArray(task?.selectionContext?.nodeIds) + ? task.selectionContext.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + if (!canvasPath || nodeIds.length !== 1) { + return null; + } + + return { + canvasPath, + nodeId: nodeIds[0], + }; + } + + cacheTaskCanvasRunSourceRef(taskId, ref) { + const normalizedTaskId = String(taskId || "").trim(); + const normalizedCanvasPath = String(ref?.canvasPath || "").trim(); + const normalizedNodeId = String(ref?.nodeId || "").trim(); + if (!normalizedTaskId || !normalizedCanvasPath || !normalizedNodeId) { + return null; + } + + const previousRef = this.canvasRunSourceRefByTaskId[normalizedTaskId] || null; + if ( + previousRef + && String(previousRef.canvasPath || "") === normalizedCanvasPath + && String(previousRef.nodeId || "") === normalizedNodeId + ) { + return { + taskId: normalizedTaskId, + canvasPath: normalizedCanvasPath, + nodeId: normalizedNodeId, + }; + } + + this.canvasRunSourceRefByTaskId[normalizedTaskId] = { + canvasPath: normalizedCanvasPath, + nodeId: normalizedNodeId, + }; + + const affectedCanvasPaths = new Set([ + String(previousRef?.canvasPath || "").trim(), + normalizedCanvasPath, + ].filter(Boolean)); + affectedCanvasPaths.forEach((canvasPath) => { + this.scheduleCanvasNodeHighlightSync(canvasPath); + }); + void this.persistPluginState(); + return { + taskId: normalizedTaskId, + canvasPath: normalizedCanvasPath, + nodeId: normalizedNodeId, + }; + } + + async setTaskCanvasRunSourceRef(taskId, ref, options = {}) { + const cachedRef = this.cacheTaskCanvasRunSourceRef(taskId, ref); + if (!cachedRef) { + return this.tasksById[String(taskId || "").trim()] || null; + } + + if (options.persistDaemon === false) { + return this.tasksById[cachedRef.taskId] || null; + } + + try { + const response = await this.api.updateTaskCanvasBinding(cachedRef.taskId, { + canvasPath: cachedRef.canvasPath, + activeSourceNodeId: cachedRef.nodeId, + }); + return this.mergeTask(response.task); + } catch (error) { + if (options.throwOnError) { + throw error; + } + return this.tasksById[cachedRef.taskId] || null; + } + } + + findTaskByRootCanvasNode(canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedNodeId) { + return null; + } + + return this.getTasks().find((task) => { + const rootRef = this.getTaskRootNodeRef(task); + return rootRef?.canvasPath === normalizedCanvasPath && rootRef?.nodeId === normalizedNodeId; + }) || null; + } + + findTaskByCanvasRunSourceNode(canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedNodeId) { + return null; + } + + return this.getTasks().find((task) => { + const sourceRef = this.getTaskCanvasRunSourceRef(task); + return sourceRef?.canvasPath === normalizedCanvasPath && sourceRef?.nodeId === normalizedNodeId; + }) || null; + } + + findTaskByResultNode(canvasPath, resultNodeId, sourceNodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedResultNodeId = String(resultNodeId || "").trim(); + const normalizedSourceNodeId = String(sourceNodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedResultNodeId || !normalizedSourceNodeId) { + return null; + } + + return this.getTasks().find((task) => { + if (this.getTaskCanvasPath(task) !== normalizedCanvasPath) { + return false; + } + + const boundResultNodeId = String( + task?.canvasBinding?.resultNodesBySourceNodeId?.[normalizedSourceNodeId]?.resultNodeId || "" + ).trim(); + if (boundResultNodeId) { + return boundResultNodeId === normalizedResultNodeId; + } + + return buildTaskResultNodeId(task.taskId, normalizedSourceNodeId) === normalizedResultNodeId; + }) || null; + } + + findTaskByOpenAgentResultNode(canvasPath, resultNodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedResultNodeId = String(resultNodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedResultNodeId) { + return null; + } + + const resultNode = this.readCanvasNodeByIdSync(normalizedCanvasPath, normalizedResultNodeId); + if (!resultNode || !isOpenAgentAssistantResultNode(resultNode)) { + return null; + } + + const metadataTaskId = getOpenAgentResultTaskId(resultNode); + const metadataTask = metadataTaskId ? this.tasksById[metadataTaskId] : null; + if (metadataTask && this.getTaskCanvasPath(metadataTask) === normalizedCanvasPath) { + return metadataTask; + } + + const sourceNodeId = getOpenAgentResultSourceNodeId(resultNode) + || this.getConversationSelectionNodeIds(normalizedCanvasPath, [normalizedResultNodeId])[0] + || ""; + if (!sourceNodeId) { + return null; + } + + return this.findTaskByResultNode(normalizedCanvasPath, normalizedResultNodeId, sourceNodeId) + || this.findTaskByCanvasRunSourceNode(normalizedCanvasPath, sourceNodeId) + || this.findTaskByRootCanvasNode(normalizedCanvasPath, sourceNodeId) + || null; + } + + findConversationTaskForUpstreamNode(canvasPath, upstreamNodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedUpstreamNodeId = String(upstreamNodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedUpstreamNodeId) { + return null; + } + + const resultTask = this.findTaskByOpenAgentResultNode(normalizedCanvasPath, normalizedUpstreamNodeId); + if (resultTask) { + return resultTask; + } + + if (normalizedUpstreamNodeId.startsWith("oa-result-")) { + const sourceNodeId = this.getConversationSelectionNodeIds(normalizedCanvasPath, [normalizedUpstreamNodeId])[0] || ""; + if (!sourceNodeId) { + return null; + } + + return this.findTaskByResultNode(normalizedCanvasPath, normalizedUpstreamNodeId, sourceNodeId) + || this.findTaskByCanvasRunSourceNode(normalizedCanvasPath, sourceNodeId) + || this.findTaskByRootCanvasNode(normalizedCanvasPath, sourceNodeId) + || null; + } + + return this.findTaskByCanvasRunSourceNode(normalizedCanvasPath, normalizedUpstreamNodeId) + || this.findTaskByRootCanvasNode(normalizedCanvasPath, normalizedUpstreamNodeId) + || null; + } + + async resolveCanvasFollowUpTarget(selection) { + const canvasPath = String(selection?.canvasPath || "").trim(); + const nodeIds = Array.isArray(selection?.nodeIds) + ? selection.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + const textBlocks = Array.isArray(selection?.textBlocks) ? selection.textBlocks : []; + if (!canvasPath || nodeIds.length !== 1 || textBlocks.length !== 1) { + return null; + } + + const followUpNodeId = nodeIds[0]; + const followUpMessage = String(textBlocks[0]?.text || "").trim(); + if (!followUpNodeId || !followUpMessage) { + return null; + } + + const abstractFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + return null; + } + + let parsed; + try { + parsed = JSON.parse(await this.app.vault.cachedRead(abstractFile)); + } catch { + return null; + } + + const edges = Array.isArray(parsed?.edges) ? parsed.edges : []; + const nodes = Array.isArray(parsed?.nodes) ? parsed.nodes : []; + const followUpNode = nodes.find((node) => String(node?.id || "").trim() === followUpNodeId) || null; + const followUpMetadata = getOpenAgentCanvasMetadata(followUpNode); + for (const edge of edges) { + const toNodeId = String(edge?.toNode || "").trim(); + if (toNodeId !== followUpNodeId) { + continue; + } + + const upstreamNodeId = String(edge?.fromNode || "").trim(); + const upstreamNode = nodes.find((node) => String(node?.id || "").trim() === upstreamNodeId) || null; + let task = this.findConversationTaskForUpstreamNode(canvasPath, upstreamNodeId); + if (!task) { + const metadataTaskId = getOpenAgentResultTaskId(upstreamNode); + if (metadataTaskId) { + try { + await this.refreshTask(metadataTaskId, { force: true, adoptCurrentVault: true }); + task = this.findConversationTaskForUpstreamNode(canvasPath, upstreamNodeId); + } catch { + task = null; + } + } + } + if (!task) { + continue; + } + + const upstreamResultSourceNodeId = getOpenAgentResultSourceNodeId(upstreamNode); + const canForkFromUpstream = isOpenAgentAssistantResultNode(upstreamNode); + const branchSourceNodeId = String( + followUpMetadata?.branchSourceNodeId + || followUpMetadata?.sourceNodeId + || upstreamResultSourceNodeId + || upstreamNodeId + ).trim(); + return { + task, + message: followUpMessage, + sourceNodeId: followUpNodeId, + upstreamNodeId, + branchSourceNodeId, + branchMessageId: String( + followUpMetadata?.branchMessageId + || getOpenAgentCanvasMetadata(upstreamNode)?.messageId + || task?.canvasBinding?.resultNodesBySourceNodeId?.[branchSourceNodeId]?.messageId + || "" + ).trim(), + canForkFromUpstream, + forceFork: followUpMetadata?.kind === "fork-request", + }; + } + + return null; + } + + countTaskUserTurnsAfterMessage(task, messageId) { + const normalizedMessageId = String(messageId || "").trim(); + if (!normalizedMessageId) { + return 0; + } + + const messages = Array.isArray(task?.messages) ? task.messages : []; + const index = messages.findIndex((message) => { + return String(message?.id || message?.streamKey || "").trim() === normalizedMessageId; + }); + if (index < 0) { + return 0; + } + + return messages.slice(index + 1).filter((message) => { + return String(message?.role || "") === "user" && String(message?.text || "").trim(); + }).length; + } + + buildCanvasForkTarget(selection, followUpTarget) { + const task = followUpTarget?.task; + const canvasPath = String(selection?.canvasPath || "").trim(); + const sourceNodeId = String(followUpTarget?.sourceNodeId || "").trim(); + const branchSourceNodeId = String(followUpTarget?.branchSourceNodeId || "").trim(); + const activeSourceNodeId = String(task?.canvasBinding?.activeSourceNodeId || "").trim(); + const forceFork = followUpTarget?.forceFork === true; + const canForkFromUpstream = followUpTarget?.canForkFromUpstream === true; + if (!task?.threadId || !canvasPath || !sourceNodeId || !branchSourceNodeId) { + return null; + } + + if (!forceFork && !canForkFromUpstream) { + return null; + } + + if (!forceFork && (!activeSourceNodeId || activeSourceNodeId === branchSourceNodeId)) { + return null; + } + + const branchMessageId = String(followUpTarget?.branchMessageId || "").trim(); + return { + task, + sourceNodeId, + branchSourceNodeId, + branchMessageId, + forceFork, + canForkFromUpstream, + upstreamNodeId: String(followUpTarget?.upstreamNodeId || "").trim(), + rollbackTurns: this.countTaskUserTurnsAfterMessage(task, branchMessageId), + }; + } + + async confirmCanvasForkFromHere(forkTarget) { + return new Promise((resolve) => { + new CanvasForkConfirmModal(this.app, { + originLabel: forkTarget?.branchSourceNodeId || "", + rollbackTurns: forkTarget?.rollbackTurns || 0, + resolve, + }).open(); + }); + } + + async runSelectionAsFollowUp(selection, options = {}) { + const followUpTarget = await this.resolveCanvasFollowUpTarget(selection); + if (!followUpTarget) { + return null; + } + + const forkTarget = this.buildCanvasForkTarget(selection, followUpTarget); + if (forkTarget) { + const decideFork = typeof options.confirmFork === "function" + ? await options.confirmFork(forkTarget) + : await this.confirmCanvasForkFromHere(forkTarget); + if (decideFork === "cancel" || decideFork === false || decideFork == null) { + return { + cancelled: true, + task: forkTarget.task, + message: followUpTarget.message, + }; + } + if (decideFork === "fork" || decideFork === true) { + return this.runSelectionAsFork(selection, followUpTarget, forkTarget); + } + } + + const task = followUpTarget.task; + await this.setTaskCanvasRunSourceRef(task.taskId, { + canvasPath: selection.canvasPath, + nodeId: followUpTarget.sourceNodeId, + }, { + throwOnError: true, + }); + + const markdownFiles = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles : []; + const imageFiles = Array.isArray(selection?.imageFiles) ? selection.imageFiles : []; + const runtimeConfig = this.buildRuntimeConfigPayload(); + const rawPrompt = markdownFiles.length > 0 + ? buildCanvasSelectionPrompt(selection, followUpTarget.message, { cwd: task.cwd }) + : followUpTarget.message; + const response = (markdownFiles.length > 0 || imageFiles.length > 0) + ? await this.api.runTask(task.taskId, { + rawPrompt, + transcriptMessage: followUpTarget.message, + forceContext: false, + selectionContext: this.withVaultScope(selection), + runtimeConfig, + }) + : await this.api.sendMessage( + task.taskId, + followUpTarget.message, + runtimeConfig + ); + + return { + task: this.mergeTask(response.task, { adoptCurrentVault: true }), + message: followUpTarget.message, + }; + } + + async runSelectionAsFork(selection, followUpTarget, forkTarget) { + const task = followUpTarget.task; + const markdownFiles = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles : []; + const imageFiles = Array.isArray(selection?.imageFiles) ? selection.imageFiles : []; + const runtimeConfig = this.buildRuntimeConfigPayload(); + const rawPrompt = (markdownFiles.length > 0 || imageFiles.length > 0) + ? buildCanvasSelectionPrompt(selection, followUpTarget.message, { cwd: task.cwd }) + : followUpTarget.message; + const response = await this.api.forkTask(task.taskId, this.withVaultScope({ + selectionContext: this.withVaultScope(selection), + cwd: task.cwd || this.resolver.inferWorkingDirectory(selection), + rawPrompt, + transcriptMessage: followUpTarget.message, + forceContext: false, + branchSourceNodeId: forkTarget.branchSourceNodeId, + branchMessageId: forkTarget.branchMessageId, + rollbackTurns: forkTarget.rollbackTurns, + runtimeConfig, + })); + + return { + task: this.mergeTask(response.task, { adoptCurrentVault: true }), + message: followUpTarget.message, + mode: "fork", + }; + } + + async handleCreateFollowUpNodeCommand() { + try { + const result = await this.createFollowUpNodeFromSelection(); + await this.revealCanvasNodeForEditing(result.canvasPath, result.followUpNodeId); + this.runtimeIssue = ""; + this.rememberSelectionSnapshot({ + canvasPath: result.canvasPath, + nodeIds: [result.followUpNodeId], + }); + await this.appendDebugEvent("canvas_follow_up_node_created", { + canvasPath: result.canvasPath, + selectedNodeId: result.selectedNodeId, + anchorNodeId: result.anchorNodeId, + followUpNodeId: result.followUpNodeId, + }); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + await this.appendDebugEvent("canvas_follow_up_node_error", { + message: this.runtimeIssue, + }); + new Notice(this.runtimeIssue); + this.requestViewRefresh({ force: true }); + } + } + + async handleCreateForkNodeCommand() { + try { + const result = await this.createFollowUpNodeFromSelection({ fork: true }); + await this.revealCanvasNodeForEditing(result.canvasPath, result.followUpNodeId); + this.runtimeIssue = ""; + this.rememberSelectionSnapshot({ + canvasPath: result.canvasPath, + nodeIds: [result.followUpNodeId], + }); + await this.appendDebugEvent("canvas_fork_node_created", { + canvasPath: result.canvasPath, + selectedNodeId: result.selectedNodeId, + anchorNodeId: result.anchorNodeId, + followUpNodeId: result.followUpNodeId, + }); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + await this.appendDebugEvent("canvas_fork_node_error", { + message: this.runtimeIssue, + }); + new Notice(this.runtimeIssue); + this.requestViewRefresh({ force: true }); + } + } + + async createFollowUpNodeFromSelection(options = {}) { + const view = this.resolver.getActiveCanvasView(); + if (!view) { + throw new Error("Open a Canvas view first."); + } + + const file = view.file || this.app.workspace.getActiveFile(); + if (!(file instanceof TFile) || file.extension !== "canvas") { + throw new Error("The active view is not backed by a .canvas file."); + } + + const selectedNodeIds = this.resolver.extractSelectedNodeIds(view).map((nodeId) => String(nodeId)).filter(Boolean); + if (selectedNodeIds.length !== 1) { + throw new Error("Select exactly one OpenAgent source or result node first."); + } + + await this.resolver.flushPendingCanvasEdits(view); + const selectedNodeId = selectedNodeIds[0]; + const result = await this.withSerializedCanvasMutation(file.path, async () => { + const raw = await this.app.vault.cachedRead(file); + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + throw new Error(`Unable to parse canvas JSON for ${file.path}`); + } + + const nodes = Array.isArray(parsed?.nodes) ? [...parsed.nodes] : []; + const edges = Array.isArray(parsed?.edges) ? [...parsed.edges] : []; + const nodeById = new Map( + nodes + .map((node) => [String(node?.id || "").trim(), node]) + .filter(([nodeId]) => nodeId) + ); + const selectedNode = nodeById.get(selectedNodeId) || null; + if (!selectedNode) { + throw new Error("The selected Canvas node could not be found."); + } + if (options.fork === true && !isOpenAgentAssistantResultNode(selectedNode)) { + throw new Error("Select an OpenAgent result node before creating a fork."); + } + if (isOpenAgentAssistantResultNode(selectedNode)) { + await this.ensureTaskForOpenAgentResultNode(file.path, selectedNode); + } + + const anchor = this.resolveFollowUpAnchorForSelectedNode(file.path, selectedNodeId, nodeById); + const isForkNode = options.fork === true; + const followUpNodeId = createCanvasObjectId(isForkNode ? "oa-fork" : "oa-follow-up"); + const followUpNode = this.buildCanvasFollowUpNode(anchor.anchorNode, followUpNodeId, edges, nodeById, { + fork: isForkNode, + task: anchor.task, + branchSourceNodeId: this.getCanvasBranchSourceNodeId(anchor.anchorNode, anchor.anchorNodeId), + }); + const followUpEdge = { + id: createCanvasObjectId(isForkNode ? "oa-fork-edge" : "oa-follow-up-edge"), + fromNode: anchor.anchorNodeId, + toNode: followUpNodeId, + fromSide: "bottom", + toSide: "top", + ...(isForkNode + ? { + openagent: { + schemaVersion: OPENAGENT_CANVAS_SCHEMA_VERSION, + kind: "fork-edge", + taskId: String(anchor.task?.taskId || ""), + threadId: String(anchor.task?.threadId || ""), + sourceNodeId: this.getCanvasBranchSourceNodeId(anchor.anchorNode, anchor.anchorNodeId), + }, + } + : {}), + }; + + const nextParsed = { + ...parsed, + nodes: [...nodes, followUpNode], + edges: [...edges, followUpEdge], + }; + await this.app.vault.modify(file, JSON.stringify(nextParsed, null, 2) + "\n"); + this.primeCanvasSnapshot(file.path, nextParsed); + return { + canvasPath: file.path, + selectedNodeId, + anchorNodeId: anchor.anchorNodeId, + followUpNodeId, + }; + }); + + this.scheduleCanvasNodeHighlightSync(file.path); + this.requestViewRefresh({ force: true }); + return result; + } + + async ensureTaskForOpenAgentResultNode(canvasPath, resultNode) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const taskId = getOpenAgentResultTaskId(resultNode); + if (!normalizedCanvasPath || !taskId) { + return null; + } + + const cachedTask = this.tasksById[taskId] || null; + if (cachedTask && this.getTaskCanvasPath(cachedTask) === normalizedCanvasPath) { + return cachedTask; + } + + await this.refreshTask(taskId, { force: true, adoptCurrentVault: true }); + const refreshedTask = this.tasksById[taskId] || null; + return refreshedTask && this.getTaskCanvasPath(refreshedTask) === normalizedCanvasPath + ? refreshedTask + : null; + } + + resolveFollowUpAnchorForSelectedNode(canvasPath, selectedNodeId, nodeById) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(selectedNodeId || "").trim(); + const selectedNode = nodeById?.get(normalizedNodeId) || null; + if (!normalizedCanvasPath || !normalizedNodeId || !selectedNode) { + throw new Error("The selected Canvas node could not be found."); + } + + if (isOpenAgentAssistantResultNode(selectedNode)) { + const task = this.findTaskByOpenAgentResultNode(normalizedCanvasPath, normalizedNodeId); + if (!task) { + throw new Error("Select an existing OpenAgent source or result node first."); + } + + return { + task, + anchorNodeId: normalizedNodeId, + anchorNode: selectedNode, + }; + } + + const task = this.findTaskByCanvasRunSourceNode(normalizedCanvasPath, normalizedNodeId) + || this.findTaskByRootCanvasNode(normalizedCanvasPath, normalizedNodeId); + if (!task) { + throw new Error("Select an existing OpenAgent source or result node first."); + } + + const resultNodeId = String( + task?.canvasBinding?.resultNodesBySourceNodeId?.[normalizedNodeId]?.resultNodeId + || buildTaskResultNodeId(task.taskId, normalizedNodeId) + ).trim(); + const resultNode = resultNodeId ? nodeById?.get(resultNodeId) || null : null; + if (resultNode && isOpenAgentAssistantResultNode(resultNode)) { + return { + task, + anchorNodeId: resultNodeId, + anchorNode: resultNode, + }; + } + + return { + task, + anchorNodeId: normalizedNodeId, + anchorNode: selectedNode, + }; + } + + getCanvasBranchSourceNodeId(anchorNode, fallbackNodeId = "") { + return getOpenAgentResultSourceNodeId(anchorNode) || String(fallbackNodeId || anchorNode?.id || "").trim(); + } + + getCanvasBranchMessageId(task, branchSourceNodeId, anchorNode = null) { + const nodeMessageId = String(getOpenAgentCanvasMetadata(anchorNode)?.messageId || "").trim(); + if (nodeMessageId) { + return nodeMessageId; + } + + return String(task?.canvasBinding?.resultNodesBySourceNodeId?.[branchSourceNodeId]?.messageId || "").trim(); + } + + buildCanvasFollowUpNode(anchorNode, followUpNodeId, edges, nodeById, options = {}) { + const width = clampNumber( + toFiniteNumber(anchorNode?.width, RESULT_NODE_DEFAULT_WIDTH), + RESULT_NODE_MIN_WIDTH, + RESULT_NODE_MAX_WIDTH + ); + const x = toFiniteNumber(anchorNode?.x, 0); + const childNodes = (Array.isArray(edges) ? edges : []) + .filter((edge) => String(edge?.fromNode || "").trim() === String(anchorNode?.id || "").trim()) + .map((edge) => nodeById?.get(String(edge?.toNode || "").trim()) || null) + .filter(Boolean) + .filter((node) => !isOpenAgentAssistantResultNode(node)); + const y = childNodes.length > 0 + ? childNodes.reduce((maxY, node) => { + const nextBottom = toFiniteNumber(node?.y, 0) + toFiniteNumber(node?.height, FOLLOW_UP_NODE_DEFAULT_HEIGHT); + return Math.max(maxY, nextBottom + RESULT_NODE_Y_GAP); + }, toFiniteNumber(anchorNode?.y, 0) + toFiniteNumber(anchorNode?.height, FOLLOW_UP_NODE_DEFAULT_HEIGHT) + RESULT_NODE_Y_GAP) + : toFiniteNumber(anchorNode?.y, 0) + toFiniteNumber(anchorNode?.height, FOLLOW_UP_NODE_DEFAULT_HEIGHT) + RESULT_NODE_Y_GAP; + + const isForkNode = options.fork === true; + const branchSourceNodeId = String(options.branchSourceNodeId || this.getCanvasBranchSourceNodeId(anchorNode)).trim(); + const branchMessageId = this.getCanvasBranchMessageId(options.task, branchSourceNodeId, anchorNode); + return { + id: followUpNodeId, + type: "text", + x, + y, + width, + height: FOLLOW_UP_NODE_DEFAULT_HEIGHT, + text: "", + ...(isForkNode + ? { + openagent: { + schemaVersion: OPENAGENT_CANVAS_SCHEMA_VERSION, + kind: "fork-request", + taskId: String(options.task?.taskId || ""), + threadId: String(options.task?.threadId || ""), + sourceNodeId: branchSourceNodeId, + branchSourceNodeId, + branchMessageId, + }, + } + : {}), + }; + } + + readCanvasNodeIdSetSync(canvasPath, cache = new Map()) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + return null; + } + + if (cache.has(normalizedCanvasPath)) { + return cache.get(normalizedCanvasPath); + } + + const snapshot = this.getCanvasSnapshotSync(normalizedCanvasPath); + if (!snapshot) { + cache.set(normalizedCanvasPath, null); + return null; + } + + cache.set(normalizedCanvasPath, snapshot.nodeIds); + return snapshot.nodeIds; + } + + readCanvasNodeByIdSync(canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedNodeId) { + return null; + } + + const snapshot = this.getCanvasSnapshotSync(normalizedCanvasPath); + return snapshot?.nodeById.get(normalizedNodeId) || null; + } + + isTaskArchived(task, cache = new Map()) { + const rootRef = this.getTaskRootNodeRef(task); + if (!rootRef) { + return false; + } + + const nodeIds = this.readCanvasNodeIdSetSync(rootRef.canvasPath, cache); + if (!nodeIds) { + return false; + } + + return !nodeIds.has(rootRef.nodeId); + } + + getFilteredTasksByArchiveState(options = {}) { + const activeCanvasPath = this.getActiveCanvasPath(); + const scopedCanvasPath = activeCanvasPath || ""; + const archiveState = options.archived === true; + const archiveProbeCache = options.archiveProbeCache instanceof Map + ? options.archiveProbeCache + : new Map(); + const filteredTasks = this.getTasks().filter((task) => { + if (scopedCanvasPath && this.getTaskCanvasPath(task) !== scopedCanvasPath) { + return false; + } + + return this.isTaskArchived(task, archiveProbeCache) === archiveState; + }); + + if (!scopedCanvasPath) { + return filteredTasks; + } + + const latestBySelection = new Map(); + filteredTasks.forEach((task) => { + const key = this.getTaskSelectionIdentity(task); + if (!key || latestBySelection.has(key)) { + return; + } + latestBySelection.set(key, task); + }); + return Array.from(latestBySelection.values()); + } + + getVisibleTasks(options = {}) { + const archiveProbeCache = options.archiveProbeCache; + return this.getFilteredTasksByArchiveState({ archived: false, archiveProbeCache }); + } + + getArchivedTasks(options = {}) { + const archiveProbeCache = options.archiveProbeCache; + return this.getFilteredTasksByArchiveState({ archived: true, archiveProbeCache }); + } + + hasUnreadTask(taskId) { + const normalizedTaskId = String(taskId || "").trim(); + if (!normalizedTaskId) { + return false; + } + + return Boolean(this.uiState?.unreadTaskStateById?.[normalizedTaskId]); + } + + updateTaskUnreadState(taskId, unread) { + const normalizedTaskId = String(taskId || "").trim(); + if (!normalizedTaskId) { + return false; + } + + const currentState = normalizeUnreadTaskState(this.uiState?.unreadTaskStateById); + const hasUnread = Boolean(currentState[normalizedTaskId]); + if (unread) { + if (hasUnread) { + return false; + } + currentState[normalizedTaskId] = true; + } else { + if (!hasUnread) { + return false; + } + delete currentState[normalizedTaskId]; + } + + this.uiState.unreadTaskStateById = currentState; + return true; + } + + setTaskUnreadState(taskId, unread, options = {}) { + const changed = this.updateTaskUnreadState(taskId, unread); + if (!changed) { + return false; + } + + if (options.persist !== false) { + void this.persistPluginState(); + } + if (options.refresh !== false) { + this.requestViewRefresh(); + } + return true; + } + + pruneUnreadTaskState() { + const currentState = normalizeUnreadTaskState(this.uiState?.unreadTaskStateById); + const taskIds = new Set(Object.keys(this.tasksById)); + let changed = false; + + Object.keys(currentState).forEach((taskId) => { + if (!taskIds.has(taskId)) { + delete currentState[taskId]; + changed = true; + } + }); + + this.uiState.unreadTaskStateById = currentState; + return changed; + } + + getRunningTasks() { + const activeCanvasPath = this.getActiveCanvasPath(); + return this.getTasks().filter((task) => { + if (activeCanvasPath && this.getTaskCanvasPath(task) !== activeCanvasPath) { + return false; + } + + return this.isTaskRunning(task); + }); + } + + getPanelTab() { + return normalizePanelTab(this.uiState?.panelTab); + } + + isTaskDetailOpen() { + return this.uiState?.taskDetailOpen === true; + } + + async setTaskDetailOpen(isOpen) { + const nextValue = isOpen === true; + this.uiState.panelTab = PANEL_TAB_OPTIONS.TASK_LIST; + if (this.uiState.taskDetailOpen === nextValue) { + this.requestViewRefresh(); + return; + } + + this.uiState.taskDetailOpen = nextValue; + await this.persistPluginState(); + this.requestViewRefresh(); + } + + async setPanelTab(panelTab) { + const nextPanelTab = normalizePanelTab(panelTab); + const previousTaskDetailOpen = this.uiState.taskDetailOpen; + if (nextPanelTab !== PANEL_TAB_OPTIONS.TASK_LIST) { + this.uiState.taskDetailOpen = false; + } + if (this.uiState.panelTab === nextPanelTab) { + if (previousTaskDetailOpen !== this.uiState.taskDetailOpen) { + await this.persistPluginState(); + } + this.requestViewRefresh(); + return; + } + + this.uiState.panelTab = nextPanelTab; + await this.persistPluginState(); + this.requestViewRefresh(); + } + + getActiveTask() { + const task = this.tasksById[this.uiState.activeTaskId] || null; + if (!this.isTaskForCurrentVault(task)) { + return null; + } + const activeCanvasPath = this.getActiveCanvasPath(); + if (!activeCanvasPath) { + return task; + } + + return this.getTaskCanvasPath(task) === activeCanvasPath ? task : null; + } + + getDraft(taskId) { + return this.uiState.draftsByTaskId?.[taskId] || ""; + } + + setDraft(taskId, value) { + this.uiState.draftsByTaskId = this.uiState.draftsByTaskId || {}; + this.uiState.draftsByTaskId[taskId] = value; + } + + clearDraft(taskId) { + if (this.uiState.draftsByTaskId) { + delete this.uiState.draftsByTaskId[taskId]; + this.persistPluginState(); + } + } + + getCanvasNodeHighlightRef(task, archiveProbeCache = new Map()) { + if (this.isTaskArchived(task, archiveProbeCache)) { + return null; + } + + return this.getTaskCanvasRunSourceRef(task); + } + + getCanvasNodeHighlightKey(canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedNodeId) { + return ""; + } + + return `${normalizedCanvasPath}\0${normalizedNodeId}`; + } + + isTaskRunning(task) { + return Boolean(task?.currentTurnId) || ["starting", "running"].includes(String(task?.status || "")); + } + + shouldMarkTaskUnread(previousTask, nextTask) { + if (!previousTask || !nextTask?.taskId) { + return false; + } + + return this.isTaskRunning(previousTask) && !this.isTaskRunning(nextTask); + } + + maybeSyncCanvasNodeHighlights(task, previousTask) { + const canvasPaths = new Set(); + const archiveProbeCache = new Map(); + [task, previousTask].forEach((entry) => { + const ref = this.getCanvasNodeHighlightRef(entry, archiveProbeCache); + if (ref?.canvasPath) { + canvasPaths.add(ref.canvasPath); + } + }); + + canvasPaths.forEach((canvasPath) => { + this.scheduleCanvasNodeHighlightSync(canvasPath); + }); + } + + reconcileAllCanvasNodeHighlights() { + const canvasPaths = new Set(); + const archiveProbeCache = new Map(); + + Object.values(this.tasksById).forEach((task) => { + const ref = this.getCanvasNodeHighlightRef(task, archiveProbeCache); + if (ref?.canvasPath) { + canvasPaths.add(ref.canvasPath); + } + }); + + Object.values(this.uiState.canvasNodeHighlightStateByKey || {}).forEach((entry) => { + const canvasPath = String(entry?.canvasPath || "").trim(); + if (canvasPath) { + canvasPaths.add(canvasPath); + } + }); + + canvasPaths.forEach((canvasPath) => { + this.scheduleCanvasNodeHighlightSync(canvasPath); + }); + } + + getRunningCanvasNodeHighlightKeys(canvasPath) { + const runningKeys = new Set(); + const archiveProbeCache = new Map(); + + Object.values(this.tasksById).forEach((task) => { + const ref = this.getCanvasNodeHighlightRef(task, archiveProbeCache); + if (!ref || ref.canvasPath !== canvasPath || !this.isTaskRunning(task)) { + return; + } + + const key = this.getCanvasNodeHighlightKey(ref.canvasPath, ref.nodeId); + if (key) { + runningKeys.add(key); + } + }); + + return runningKeys; + } + + getCompletedCanvasNodeHighlightKeys(canvasPath) { + const completedKeys = new Set(); + const archiveProbeCache = new Map(); + + Object.values(this.tasksById).forEach((task) => { + const ref = this.getCanvasNodeHighlightRef(task, archiveProbeCache); + if (!ref || ref.canvasPath !== canvasPath || this.isTaskRunning(task)) { + return; + } + + const assistantMessage = this.getLatestAssistantMessage(task); + if ( + String(task?.status || "") !== "idle" + || !assistantMessage?.text?.trim() + || !this.isLatestAssistantMessageCurrentForActiveSource(task, assistantMessage) + ) { + return; + } + + const key = this.getCanvasNodeHighlightKey(ref.canvasPath, ref.nodeId); + if (key) { + completedKeys.add(key); + } + }); + + return completedKeys; + } + + getTrackedCanvasNodeHighlightKeys(canvasPath) { + const trackedKeys = new Set(); + + Object.keys(this.uiState.canvasNodeHighlightStateByKey || {}).forEach((key) => { + const [trackedCanvasPath] = key.split("\0"); + if (trackedCanvasPath === canvasPath) { + trackedKeys.add(key); + } + }); + + return trackedKeys; + } + + scheduleCanvasNodeHighlightSync(canvasPath) { + if (!canvasPath) { + return; + } + + if (this.canvasNodeHighlightSyncInFlight.has(canvasPath)) { + this.canvasNodeHighlightSyncPending.add(canvasPath); + return; + } + + this.canvasNodeHighlightSyncInFlight.add(canvasPath); + void this.syncCanvasNodeHighlightsForCanvas(canvasPath) + .catch(async (error) => { + await this.appendDebugEvent("canvas_highlight_error", { + canvasPath, + message: String(error?.message || error), + }); + }) + .finally(() => { + this.canvasNodeHighlightSyncInFlight.delete(canvasPath); + if (this.canvasNodeHighlightSyncPending.has(canvasPath)) { + this.canvasNodeHighlightSyncPending.delete(canvasPath); + this.scheduleCanvasNodeHighlightSync(canvasPath); + } + }); + } + + async syncCanvasNodeHighlightsForCanvas(canvasPath) { + await this.withSerializedCanvasMutation(canvasPath, async () => { + const runningKeys = this.getRunningCanvasNodeHighlightKeys(canvasPath); + const completedKeys = this.getCompletedCanvasNodeHighlightKeys(canvasPath); + const trackedKeys = this.getTrackedCanvasNodeHighlightKeys(canvasPath); + if (runningKeys.size === 0 && completedKeys.size === 0 && trackedKeys.size === 0) { + return; + } + + const highlightStateByKey = this.uiState.canvasNodeHighlightStateByKey || {}; + const abstractFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + let stateChanged = false; + trackedKeys.forEach((key) => { + if (highlightStateByKey[key]) { + delete highlightStateByKey[key]; + stateChanged = true; + } + }); + if (stateChanged) { + await this.persistPluginState(); + } + return; + } + + const raw = await this.app.vault.cachedRead(abstractFile); + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + throw new Error(`Unable to parse canvas JSON for ${canvasPath}`); + } + + const nodes = Array.isArray(parsed?.nodes) ? [...parsed.nodes] : []; + const relevantKeys = new Set([...runningKeys, ...completedKeys, ...trackedKeys]); + const seenKeys = new Set(); + let nodesChanged = false; + let stateChanged = false; + + for (let index = 0; index < nodes.length; index += 1) { + const node = nodes[index]; + const nodeId = String(node?.id || "").trim(); + if (!nodeId) { + continue; + } + + const key = this.getCanvasNodeHighlightKey(canvasPath, nodeId); + if (!relevantKeys.has(key)) { + continue; + } + + seenKeys.add(key); + const shouldHighlight = runningKeys.has(key); + const shouldMarkCompleted = !shouldHighlight && completedKeys.has(key); + const hasColor = Object.prototype.hasOwnProperty.call(node, "color"); + const currentColor = hasColor ? String(node.color) : ""; + const storedState = highlightStateByKey[key] || null; + + if (shouldHighlight) { + if (!storedState) { + highlightStateByKey[key] = { + canvasPath, + nodeId, + originalColor: hasColor ? node.color : null, + }; + stateChanged = true; + } + + const autoFitHeight = getCanvasTextNodeAutoFitHeight(node); + const shouldResize = Number.isFinite(autoFitHeight) && autoFitHeight > toFiniteNumber(node?.height, 0); + if (!hasColor || currentColor !== RUNNING_CANVAS_NODE_COLOR || shouldResize) { + nodes[index] = { + ...node, + color: RUNNING_CANVAS_NODE_COLOR, + ...(shouldResize ? { height: autoFitHeight } : {}), + }; + nodesChanged = true; + } + continue; + } + + if (shouldMarkCompleted) { + if (!hasColor || String(node.color) !== COMPLETED_CANVAS_NODE_COLOR) { + nodes[index] = { + ...node, + color: COMPLETED_CANVAS_NODE_COLOR, + }; + nodesChanged = true; + } + + if (storedState) { + delete highlightStateByKey[key]; + stateChanged = true; + } + continue; + } + + if (!storedState) { + continue; + } + + if (!hasColor || String(node.color) !== COMPLETED_CANVAS_NODE_COLOR) { + nodes[index] = { + ...node, + color: COMPLETED_CANVAS_NODE_COLOR, + }; + nodesChanged = true; + } + + delete highlightStateByKey[key]; + stateChanged = true; + } + + trackedKeys.forEach((key) => { + if (seenKeys.has(key) || !highlightStateByKey[key]) { + return; + } + + delete highlightStateByKey[key]; + stateChanged = true; + }); + + if (nodesChanged) { + parsed = { + ...parsed, + nodes, + }; + await this.app.vault.modify(abstractFile, JSON.stringify(parsed, null, 2) + "\n"); + this.primeCanvasSnapshot(canvasPath, parsed); + } + + if (stateChanged) { + await this.persistPluginState(); + } + }); + } + + mergeTask(task, options = {}) { + if (!task) { + return null; + } + + const previousTask = this.tasksById[task.taskId] || null; + const inputTask = options.adoptCurrentVault === true && !this.getTaskVaultId(task) + ? this.scopeTaskForCurrentVault(task) + : task; + const nextTask = this.normalizeTaskForStore(inputTask, previousTask); + if (!nextTask) { + return null; + } + this.tasksById[nextTask.taskId] = nextTask; + const didMarkUnread = this.shouldMarkTaskUnread(previousTask, nextTask) + && this.updateTaskUnreadState(nextTask.taskId, true); + if (didMarkUnread) { + void this.persistPluginState(); + } + this.syncActiveTaskToCanvasContext(); + this.maybeSyncCanvasNodeHighlights(nextTask, previousTask); + this.maybeSyncTaskResultNode(nextTask, previousTask); + this.reconcileRunningTaskStreams(); + return nextTask; + } + + taskHasLoadedMessages(task) { + return Boolean(task) && task.messagesIncluded !== false; + } + + normalizeTaskForStore(task, previousTask = null) { + if (!task?.taskId) { + return null; + } + const scopedTask = !this.getTaskVaultId(task) && this.isTaskForCurrentVault(previousTask) + ? this.scopeTaskForCurrentVault(task) + : task; + if (!this.isTaskForCurrentVault(scopedTask)) { + return null; + } + + const nextTask = { + ...scopedTask, + }; + const shouldReuseDetailedMessages = ( + nextTask.messagesIncluded === false + && previousTask + && previousTask.messagesIncluded !== false + && String(previousTask.taskId || "") === String(this.uiState?.activeTaskId || "") + && Array.isArray(previousTask.messages) + ); + + if (shouldReuseDetailedMessages) { + nextTask.messages = previousTask.messages; + nextTask.messagesIncluded = true; + } else { + nextTask.messages = Array.isArray(task.messages) ? task.messages : []; + nextTask.messagesIncluded = task.messagesIncluded !== false; + } + + if (typeof nextTask.messageCount !== "number") { + nextTask.messageCount = nextTask.messages.length; + } + + if (!nextTask.latestAssistantMessage && previousTask?.latestAssistantMessage) { + nextTask.latestAssistantMessage = previousTask.latestAssistantMessage; + } + + return nextTask; + } + + getLatestAssistantMessage(task) { + const messages = Array.isArray(task?.messages) ? task.messages : []; + for (let index = messages.length - 1; index >= 0; index -= 1) { + const message = messages[index]; + const text = String(message?.text || ""); + if (message?.role === "assistant" && text.trim()) { + return { + ...message, + text, + }; + } + } + + const latestAssistantMessage = task?.latestAssistantMessage; + const text = String(latestAssistantMessage?.text || ""); + if (text.trim()) { + return { + ...latestAssistantMessage, + text, + }; + } + + return null; + } + + isLatestAssistantMessageCurrentForActiveSource(task, assistantMessage = null) { + const candidate = assistantMessage || this.getLatestAssistantMessage(task); + if (!candidate?.text?.trim()) { + return false; + } + + const activeSourceUpdatedAt = String(task?.canvasBinding?.activeSourceUpdatedAt || "").trim(); + if (!activeSourceUpdatedAt) { + return true; + } + + const assistantTimestamp = String(candidate.updatedAt || candidate.createdAt || "").trim(); + return !assistantTimestamp || assistantTimestamp >= activeSourceUpdatedAt; + } + + getTaskResultSyncSignature(task) { + const assistantMessage = this.getLatestAssistantMessage(task); + if (!assistantMessage?.text?.trim() || !this.isLatestAssistantMessageCurrentForActiveSource(task, assistantMessage)) { + return ""; + } + + const sourceRef = this.getTaskCanvasRunSourceRef(task); + return stableShortHash(`${task?.taskId || ""}\0${sourceRef?.nodeId || ""}\0${assistantMessage.text}`); + } + + getTaskResultNodeRef(task) { + const sourceRef = this.getTaskCanvasRunSourceRef(task); + const canvasPath = String(sourceRef?.canvasPath || "").trim(); + const sourceNodeId = String(sourceRef?.nodeId || "").trim(); + const boundResultNodeId = String( + task?.canvasBinding?.resultNodesBySourceNodeId?.[sourceNodeId]?.resultNodeId || "" + ).trim(); + const taskId = String(task?.taskId || "").trim(); + if (!canvasPath || !sourceNodeId || !taskId) { + return null; + } + + return { + canvasPath, + sourceNodeId, + resultNodeId: boundResultNodeId || buildTaskResultNodeId(taskId, sourceNodeId), + }; + } + + canSyncTaskResultNode(task, cache = new Map()) { + const ref = this.getTaskResultNodeRef(task); + if (!ref) { + return false; + } + + const nodeIds = this.readCanvasNodeIdSetSync(ref.canvasPath, cache); + return Boolean(nodeIds?.has(ref.sourceNodeId)); + } + + doesTaskResultNodeExist(task, cache = new Map()) { + const ref = this.getTaskResultNodeRef(task); + if (!ref) { + return false; + } + + const nodeIds = this.readCanvasNodeIdSetSync(ref.canvasPath, cache); + return Boolean(nodeIds?.has(ref.resultNodeId)); + } + + doesTaskResultNodeHaveCurrentMetadata(task, signature) { + const ref = this.getTaskResultNodeRef(task); + if (!ref) { + return false; + } + + const resultNode = this.readCanvasNodeByIdSync(ref.canvasPath, ref.resultNodeId); + const metadata = getOpenAgentCanvasMetadata(resultNode); + return Boolean( + metadata?.kind === "assistant-result" + && String(metadata.taskId || "") === String(task?.taskId || "") + && String(metadata.sourceNodeId || "") === ref.sourceNodeId + && String(metadata.syncSignature || "") === String(signature || "") + ); + } + + shouldAutoSyncTaskResultNode(task, previousTask) { + const selection = task?.selectionContext; + const nodeIds = Array.isArray(selection?.nodeIds) + ? selection.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + const textBlocks = Array.isArray(selection?.textBlocks) ? selection.textBlocks : []; + const markdownFiles = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles : []; + const imageFiles = Array.isArray(selection?.imageFiles) ? selection.imageFiles : []; + const hasSingleSupportedSource = ( + (textBlocks.length === 1) + || (textBlocks.length === 0 && markdownFiles.length === 1) + || (textBlocks.length === 0 && markdownFiles.length === 0 && imageFiles.length === 1) + ); + if (nodeIds.length !== 1 || !hasSingleSupportedSource) { + return false; + } + + if (String(task?.status || "") !== "idle" || task?.currentTurnId) { + return false; + } + + const canvasNodeCache = new Map(); + if (!this.canSyncTaskResultNode(task, canvasNodeCache)) { + return false; + } + + const signature = this.getTaskResultSyncSignature(task); + if (!signature) { + return false; + } + + const resultNodeExists = this.doesTaskResultNodeExist(task, canvasNodeCache); + const resultNodeMetadataCurrent = resultNodeExists + ? this.doesTaskResultNodeHaveCurrentMetadata(task, signature) + : false; + if ( + this.resultNodeSyncStateByTaskId[task.taskId] === signature + && resultNodeExists + && resultNodeMetadataCurrent + ) { + return false; + } + + if (resultNodeExists && !resultNodeMetadataCurrent) { + return true; + } + + if ( + previousTask + && ( + previousTask.currentTurnId + || ["starting", "running"].includes(String(previousTask.status || "")) + ) + ) { + return true; + } + + return !resultNodeExists; + } + + maybeSyncTaskResultNode(task, previousTask) { + if (!this.shouldAutoSyncTaskResultNode(task, previousTask)) { + return; + } + + if (this.resultNodeSyncInFlight.has(task.taskId)) { + return; + } + + const signature = this.getTaskResultSyncSignature(task); + if (!signature) { + return; + } + + this.resultNodeSyncInFlight.add(task.taskId); + void this.syncTaskResultNode(task, signature) + .catch((error) => { + const message = String(error?.message || error); + void this.appendDebugEvent("canvas_result_error", { + taskId: task.taskId, + message, + }); + new Notice(`Unable to write the Canvas result node: ${message}`); + }) + .finally(() => { + this.resultNodeSyncInFlight.delete(task.taskId); + }); + } + + async syncTaskResultNode(task, signature) { + const assistantMessage = this.getLatestAssistantMessage(task); + const result = await this.upsertCanvasResultNode(task, assistantMessage, signature); + const bindingResponse = await this.api.updateTaskCanvasBinding(task.taskId, { + canvasPath: result.canvasPath, + activeSourceNodeId: result.sourceNodeId, + resultNode: { + sourceNodeId: result.sourceNodeId, + resultNodeId: result.resultNodeId, + edgeId: result.edgeId, + messageId: String(assistantMessage?.id || ""), + syncSignature: signature, + }, + }); + this.mergeTask(bindingResponse.task); + this.resultNodeSyncStateByTaskId[task.taskId] = signature; + await this.persistPluginState(); + await this.appendDebugEvent("canvas_result_synced", { + taskId: task.taskId, + canvasPath: result.canvasPath, + sourceNodeId: result.sourceNodeId, + resultNodeId: result.resultNodeId, + }); + new Notice("Created a linked Canvas result node."); + } + + async upsertCanvasResultNode(task, assistantMessage, signature = "") { + const sourceRef = this.getTaskCanvasRunSourceRef(task); + const canvasPath = String(sourceRef?.canvasPath || task?.selectionContext?.canvasPath || "").trim(); + const sourceNodeId = String(sourceRef?.nodeId || task?.selectionContext?.nodeIds?.[0] || "").trim(); + if (!canvasPath || !sourceNodeId) { + throw new Error("Task is missing the Canvas source node."); + } + + const normalizedText = String(assistantMessage?.text || assistantMessage || "").trim(); + if (!normalizedText) { + throw new Error("There is no assistant result to write back into the Canvas."); + } + const canvasText = this.normalizeAssistantLinksForObsidian(normalizedText); + + return this.withSerializedCanvasMutation(canvasPath, async () => { + const abstractFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + throw new Error(`Canvas file not found: ${canvasPath}`); + } + + const raw = await this.app.vault.cachedRead(abstractFile); + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + throw new Error(`Unable to parse canvas JSON for ${canvasPath}`); + } + + const nodes = Array.isArray(parsed?.nodes) ? [...parsed.nodes] : []; + const edges = Array.isArray(parsed?.edges) ? [...parsed.edges] : []; + const sourceNodeIndex = nodes.findIndex((node) => String(node?.id || "") === sourceNodeId); + if (sourceNodeIndex < 0) { + throw new Error(`Source Canvas node is missing: ${sourceNodeId}`); + } + + const sourceNode = nodes[sourceNodeIndex] || {}; + const nextSourceNode = { + ...sourceNode, + color: COMPLETED_CANVAS_NODE_COLOR, + }; + nodes[sourceNodeIndex] = nextSourceNode; + const resultNodeId = buildTaskResultNodeId(task.taskId, sourceNodeId); + const edgeId = `oa-edge-${stableShortHash(`${sourceNodeId}\0${task.taskId}`)}`; + const existingResultNodeIndex = nodes.findIndex((node) => String(node?.id || "") === resultNodeId); + const existingResultNode = existingResultNodeIndex >= 0 ? nodes[existingResultNodeIndex] : null; + const resultMetadata = { + ...(getOpenAgentCanvasMetadata(existingResultNode) || {}), + schemaVersion: OPENAGENT_CANVAS_SCHEMA_VERSION, + kind: "assistant-result", + taskId: String(task.taskId || ""), + threadId: String(task.threadId || ""), + sourceNodeId, + messageId: String(assistantMessage?.id || ""), + syncSignature: String(signature || this.getTaskResultSyncSignature(task) || ""), + }; + + const defaultWidth = clampNumber( + toFiniteNumber(existingResultNode?.width, toFiniteNumber(sourceNode.width, RESULT_NODE_DEFAULT_WIDTH)), + RESULT_NODE_MIN_WIDTH, + RESULT_NODE_MAX_WIDTH + ); + const defaultX = toFiniteNumber(sourceNode.x, 0); + const siblingResultNodes = edges + .filter((edge) => String(edge?.fromNode || "") === sourceNodeId) + .map((edge) => nodes.find((node) => String(node?.id || "") === String(edge?.toNode || ""))) + .filter((node) => node && String(node.id || "") !== resultNodeId && isOpenAgentAssistantResultNode(node)); + const defaultY = siblingResultNodes.length > 0 + ? siblingResultNodes.reduce((maxY, node) => { + const nextBottom = toFiniteNumber(node.y, toFiniteNumber(sourceNode.y, 0)) + toFiniteNumber(node.height, RESULT_NODE_MIN_HEIGHT); + return Math.max(maxY, nextBottom + RESULT_NODE_Y_GAP); + }, toFiniteNumber(sourceNode.y, 0) + toFiniteNumber(sourceNode.height, RESULT_NODE_MIN_HEIGHT) + RESULT_NODE_Y_GAP) + : toFiniteNumber(sourceNode.y, 0) + toFiniteNumber(sourceNode.height, RESULT_NODE_MIN_HEIGHT) + RESULT_NODE_Y_GAP; + const resultNode = { + ...(existingResultNode || {}), + id: resultNodeId, + type: "text", + x: existingResultNode ? toFiniteNumber(existingResultNode.x, defaultX) : defaultX, + y: existingResultNode ? toFiniteNumber(existingResultNode.y, defaultY) : defaultY, + width: existingResultNode ? clampNumber(toFiniteNumber(existingResultNode.width, defaultWidth), RESULT_NODE_MIN_WIDTH, RESULT_NODE_MAX_WIDTH) : defaultWidth, + height: estimateCanvasTextNodeHeight( + canvasText, + existingResultNode ? toFiniteNumber(existingResultNode.width, defaultWidth) : defaultWidth + ), + text: canvasText, + openagent: resultMetadata, + }; + + if (existingResultNodeIndex >= 0) { + nodes[existingResultNodeIndex] = resultNode; + } else { + nodes.push(resultNode); + } + + const existingEdgeIndex = edges.findIndex((edge) => ( + String(edge?.id || "") === edgeId + || ( + String(edge?.fromNode || "") === sourceNodeId + && String(edge?.toNode || "") === resultNodeId + ) + )); + const edge = { + ...(existingEdgeIndex >= 0 ? edges[existingEdgeIndex] : {}), + id: edgeId, + fromNode: sourceNodeId, + toNode: resultNodeId, + fromSide: existingEdgeIndex >= 0 ? String(edges[existingEdgeIndex]?.fromSide || "bottom") : "bottom", + toSide: existingEdgeIndex >= 0 ? String(edges[existingEdgeIndex]?.toSide || "top") : "top", + openagent: { + ...(existingEdgeIndex >= 0 ? getOpenAgentCanvasMetadata(edges[existingEdgeIndex]) || {} : {}), + schemaVersion: OPENAGENT_CANVAS_SCHEMA_VERSION, + kind: "result-edge", + taskId: String(task.taskId || ""), + threadId: String(task.threadId || ""), + sourceNodeId, + resultNodeId, + }, + }; + + if (existingEdgeIndex >= 0) { + edges[existingEdgeIndex] = edge; + } else { + edges.push(edge); + } + + parsed = { + ...parsed, + nodes, + edges, + }; + await this.app.vault.modify(abstractFile, JSON.stringify(parsed, null, 2) + "\n"); + this.primeCanvasSnapshot(canvasPath, parsed); + + return { + canvasPath, + sourceNodeId, + resultNodeId, + edgeId, + }; + }); + } + + async activateView() { + let leaf = this.app.workspace.getLeavesOfType(VIEW_TYPE)[0]; + if (!leaf) { + leaf = this.app.workspace.getRightLeaf(false); + await leaf.setViewState({ type: VIEW_TYPE, active: true }); + } + + this.app.workspace.revealLeaf(leaf); + this.requestViewRefresh(); + } + + async activateVoiceGraphView() { + let leaf = this.app.workspace.getLeavesOfType(VOICE_GRAPH_VIEW_TYPE)[0]; + if (!leaf) { + leaf = this.app.workspace.getLeaf("tab"); + await leaf.setViewState({ type: VOICE_GRAPH_VIEW_TYPE, active: true }); + } + + this.app.workspace.revealLeaf(leaf); + } + + async openThreadList() { + await this.activateView(); + await this.setPanelTab(PANEL_TAB_OPTIONS.WORKSPACE_SETTINGS); + } + + getTaskJumpNodeRef(task) { + if (!task) { + return null; + } + + const assistantMessage = this.getLatestAssistantMessage(task); + const resultRef = this.getTaskResultNodeRef(task); + if ( + resultRef + && assistantMessage?.text?.trim() + && this.isLatestAssistantMessageCurrentForActiveSource(task, assistantMessage) + && this.readCanvasNodeByIdSync(resultRef.canvasPath, resultRef.resultNodeId) + ) { + return { + canvasPath: resultRef.canvasPath, + nodeId: resultRef.resultNodeId, + }; + } + + const sourceRef = this.getTaskCanvasRunSourceRef(task); + if (sourceRef && this.readCanvasNodeByIdSync(sourceRef.canvasPath, sourceRef.nodeId)) { + return sourceRef; + } + + const rootRef = this.getTaskRootNodeRef(task); + if (rootRef && this.readCanvasNodeByIdSync(rootRef.canvasPath, rootRef.nodeId)) { + return rootRef; + } + + return sourceRef || rootRef || null; + } + + findCanvasLeafByPath(canvasPath) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + return null; + } + + return this.app.workspace.getLeavesOfType("canvas").find((leaf) => { + return String(leaf?.view?.file?.path || "").trim() === normalizedCanvasPath; + }) || null; + } + + findCanvasRuntimeNodeById(canvas, nodeId) { + const normalizedNodeId = String(nodeId || "").trim(); + if (!canvas || !normalizedNodeId) { + return null; + } + + const getCandidateNodeId = (candidate) => { + if (!candidate || typeof candidate !== "object") { + return ""; + } + + const directIds = [ + candidate.id, + candidate.node?.id, + candidate.data?.id, + candidate.node?.data?.id, + candidate.item?.id, + candidate.item?.data?.id, + ]; + for (const candidateId of directIds) { + const normalizedCandidateId = String(candidateId || "").trim(); + if (normalizedCandidateId) { + return normalizedCandidateId; + } + } + + if (typeof candidate.getData === "function") { + try { + return String(candidate.getData()?.id || "").trim(); + } catch { + return ""; + } + } + + return ""; + }; + const matchesNodeId = (candidate) => getCandidateNodeId(candidate) === normalizedNodeId; + const candidateCollections = [ + canvas?.nodes, + canvas?.nodeMap, + canvas?.selectionManager?.nodes, + ].filter(Boolean); + + for (const collection of candidateCollections) { + if (collection instanceof Map) { + const directMatch = collection.get(normalizedNodeId); + if (directMatch) { + return directMatch; + } + + for (const value of collection.values()) { + if (matchesNodeId(value)) { + return value; + } + } + continue; + } + + if (Array.isArray(collection)) { + const directMatch = collection.find((value) => matchesNodeId(value)); + if (directMatch) { + return directMatch; + } + continue; + } + + if (typeof collection === "object") { + const directMatch = collection[normalizedNodeId]; + if (matchesNodeId(directMatch)) { + return directMatch; + } + + for (const value of Object.values(collection)) { + if (matchesNodeId(value)) { + return value; + } + } + } + } + + return null; + } + + selectCanvasNodeInView(view, nodeId, runtimeNode = null) { + const normalizedNodeId = String(nodeId || "").trim(); + const canvas = view?.canvas; + if (!normalizedNodeId || !canvas) { + return false; + } + + const deselectCalls = [ + [canvas, "deselectAll"], + [canvas?.selectionManager, "deselectAll"], + [canvas?.selectionManager, "clear"], + ]; + deselectCalls.forEach(([owner, method]) => { + if (typeof owner?.[method] !== "function") { + return; + } + + try { + owner[method](); + } catch { + // Ignore Canvas API differences across Obsidian versions. + } + }); + + if (runtimeNode) { + const selectCalls = [ + [canvas, "select"], + [canvas?.selectionManager, "select"], + ]; + for (const [owner, method] of selectCalls) { + if (typeof owner?.[method] !== "function") { + continue; + } + + try { + owner[method](runtimeNode); + return true; + } catch { + // Fall through to DOM selection fallback below. + } + } + } + + const selector = `[data-node-id="${escapeAttributeSelectorValue(normalizedNodeId)}"]`; + const nodeEl = view?.containerEl?.querySelector?.(selector); + if (!nodeEl) { + return false; + } + + ["mousedown", "mouseup", "click"].forEach((eventName) => { + try { + nodeEl.dispatchEvent(new MouseEvent(eventName, { + bubbles: true, + cancelable: true, + button: 0, + })); + } catch { + // Ignore DOM event dispatch failures on older runtimes. + } + }); + return true; + } + + getCanvasNodeElement(view, nodeId) { + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedNodeId) { + return null; + } + + const selector = `[data-node-id="${escapeAttributeSelectorValue(normalizedNodeId)}"]`; + return view?.containerEl?.querySelector?.(selector) || null; + } + + getEditableCanvasNodeElement(view, nodeId) { + const nodeEl = this.getCanvasNodeElement(view, nodeId); + if (!nodeEl) { + return null; + } + + return nodeEl.querySelector?.("textarea, input, [contenteditable='true'], .cm-content") + || nodeEl; + } + + focusEditableCanvasNodeElement(element) { + if (!element || typeof element.focus !== "function") { + return false; + } + + try { + element.focus(); + } catch { + return false; + } + + if (typeof element.setSelectionRange === "function" && typeof element.value === "string") { + try { + const offset = element.value.length; + element.setSelectionRange(offset, offset); + } catch { + // Ignore selection placement failures on unsupported inputs. + } + } + + return true; + } + + getRuntimeEditableCanvasNodeElement(runtimeNode) { + if (!runtimeNode || typeof runtimeNode !== "object") { + return null; + } + + const directEditor = runtimeNode?.child?.editMode?.cm?.dom; + if (directEditor instanceof HTMLElement) { + return directEditor.querySelector?.(".cm-content") || directEditor; + } + + return null; + } + + async enterCanvasNodeEditModeInView(view, nodeId) { + const normalizedNodeId = String(nodeId || "").trim(); + if (!view?.canvas || !normalizedNodeId) { + return false; + } + + let runtimeNode = this.findCanvasRuntimeNodeById(view.canvas, normalizedNodeId); + this.selectCanvasNodeInView(view, normalizedNodeId, runtimeNode); + const tryStartEditing = () => { + runtimeNode = this.findCanvasRuntimeNodeById(view.canvas, normalizedNodeId) || runtimeNode; + if (typeof runtimeNode?.startEditing === "function") { + try { + runtimeNode.startEditing(); + return true; + } catch { + // Fall through to older edit-mode shims below. + } + } + + if (typeof runtimeNode?.setIsEditing === "function") { + try { + runtimeNode.setIsEditing(true); + return true; + } catch { + return false; + } + } + + return false; + }; + + for (let attempt = 0; attempt < 8; attempt += 1) { + if (attempt > 0) { + await sleep(attempt === 1 ? 0 : 50); + } + + tryStartEditing(); + const runtimeEditableElement = this.getRuntimeEditableCanvasNodeElement(runtimeNode); + if (this.resolver.isEditableCanvasElement(runtimeEditableElement) && this.focusEditableCanvasNodeElement(runtimeEditableElement)) { + return true; + } + + if (typeof runtimeNode?.focus === "function") { + try { + runtimeNode.focus(); + } catch { + // Ignore runtime focus failures and continue to DOM fallbacks. + } + } + + const editableElement = this.getEditableCanvasNodeElement(view, normalizedNodeId); + if (this.resolver.isEditableCanvasElement(editableElement) && this.focusEditableCanvasNodeElement(editableElement)) { + return true; + } + + const nodeEl = this.getCanvasNodeElement(view, normalizedNodeId); + if (!nodeEl) { + continue; + } + + const interactionTarget = nodeEl.querySelector?.(".canvas-node-content, .canvas-node-container") + || nodeEl; + try { + interactionTarget.dispatchEvent(new MouseEvent("dblclick", { + bubbles: true, + cancelable: true, + button: 0, + detail: 2, + })); + } catch { + // Ignore DOM interaction failures on older runtimes. + } + } + + return false; + } + + focusCanvasNodeInView(view, canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!view?.canvas || !normalizedCanvasPath || !normalizedNodeId) { + return false; + } + + const node = this.readCanvasNodeByIdSync(normalizedCanvasPath, normalizedNodeId); + if (!node) { + return false; + } + + if (typeof view.canvas.zoomToBbox === "function") { + try { + view.canvas.zoomToBbox({ + minX: toFiniteNumber(node?.x, 0) - Math.max(1, toFiniteNumber(node?.width, RESULT_NODE_DEFAULT_WIDTH)), + minY: toFiniteNumber(node?.y, 0) - Math.max(1, toFiniteNumber(node?.height, RESULT_NODE_MIN_HEIGHT)), + maxX: toFiniteNumber(node?.x, 0) + Math.max(1, toFiniteNumber(node?.width, RESULT_NODE_DEFAULT_WIDTH)), + maxY: toFiniteNumber(node?.y, 0) + Math.max(1, toFiniteNumber(node?.height, RESULT_NODE_MIN_HEIGHT)), + }); + } catch { + // Ignore zoom failures and still attempt selection below. + } + } + + const runtimeNode = this.findCanvasRuntimeNodeById(view.canvas, normalizedNodeId); + return this.selectCanvasNodeInView(view, normalizedNodeId, runtimeNode); + } + + async revealCanvasNode(canvasPath, nodeId) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeId = String(nodeId || "").trim(); + if (!normalizedCanvasPath || !normalizedNodeId) { + return false; + } + + const abstractFile = this.app.vault.getAbstractFileByPath(normalizedCanvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + return false; + } + + const activeLeaf = this.app.workspace.activeLeaf; + const reusableLeaf = this.app.workspace.getMostRecentLeaf(); + const leaf = this.findCanvasLeafByPath(normalizedCanvasPath) + || (activeLeaf?.view?.getViewType?.() === "canvas" ? activeLeaf : null) + || this.app.workspace.getLeavesOfType("canvas")[0] + || (reusableLeaf?.view?.getViewType?.() === VIEW_TYPE ? null : reusableLeaf) + || this.app.workspace.getLeaf(true); + await leaf.openFile(abstractFile); + this.app.workspace.revealLeaf(leaf); + + for (let attempt = 0; attempt < 8; attempt += 1) { + const view = leaf?.view?.getViewType?.() === "canvas" + ? leaf.view + : this.resolver.getActiveCanvasView(); + const viewCanvasPath = String(view?.file?.path || "").trim(); + if (viewCanvasPath === normalizedCanvasPath && this.focusCanvasNodeInView(view, normalizedCanvasPath, normalizedNodeId)) { + return true; + } + + await sleep(attempt === 0 ? 0 : 50); + } + + return false; + } + + async revealCanvasNodeForEditing(canvasPath, nodeId) { + const didReveal = await this.revealCanvasNode(canvasPath, nodeId); + if (!didReveal) { + return false; + } + + for (let attempt = 0; attempt < 8; attempt += 1) { + const view = this.findCanvasLeafByPath(canvasPath)?.view || this.resolver.getActiveCanvasView(); + const viewCanvasPath = String(view?.file?.path || "").trim(); + if (viewCanvasPath === String(canvasPath || "").trim() && await this.enterCanvasNodeEditModeInView(view, nodeId)) { + return true; + } + + await sleep(attempt === 0 ? 0 : 50); + } + + return false; + } + + async revealTaskInCanvas(task) { + const ref = this.getTaskJumpNodeRef(task); + if (!ref) { + return false; + } + + return this.revealCanvasNode(ref.canvasPath, ref.nodeId); + } + + async activateTaskFromList(taskId, options = {}) { + const normalizedTaskId = String(taskId || "").trim(); + const task = this.tasksById[normalizedTaskId] || null; + if (!task) { + return false; + } + + await this.setActiveTask(normalizedTaskId, { + revealInActiveTab: options.revealInActiveTab !== false, + showDetail: options.showDetail === true, + }); + if (options.revealInCanvas === false) { + return true; + } + + return this.revealTaskInCanvas(this.tasksById[normalizedTaskId] || task); + } + + async ensurePanelVisibleOnStartup() { + if (this.app.workspace.getLeavesOfType(VIEW_TYPE).length > 0) { + return; + } + + try { + await this.activateView(); + } catch { + // Ignore startup panel errors and let the manual command remain the fallback. + } + } + + handleCanvasFileMutation(file) { + if (!(file instanceof TFile) || file.extension !== "canvas") { + return; + } + + const canvasPath = String(file.path || "").trim(); + if (!canvasPath) { + return; + } + + const previousSnapshot = this.canvasSnapshotCacheByPath.get(canvasPath) || null; + this.invalidateCanvasSnapshot(canvasPath); + + const activeCanvasPath = this.getActiveCanvasPath(); + const affectsKnownTask = Object.values(this.tasksById).some((task) => this.getTaskCanvasPath(task) === canvasPath); + if (!affectsKnownTask && activeCanvasPath !== canvasPath) { + return; + } + + const nextSnapshot = this.getCanvasSnapshotSync(canvasPath); + const autoRunNodeIds = this.getAutoRunCandidateNodeIds(previousSnapshot, nextSnapshot); + if (autoRunNodeIds.length > 0) { + void this.triggerAutoRunForCanvasNodes(canvasPath, autoRunNodeIds); + } + + this.syncActiveTaskToCanvasContext(); + void this.refreshSelectedGroupContextPreview(); + this.scheduleCanvasNodeHighlightSync(canvasPath); + this.requestViewRefresh(); + } + + hasFocusedComposer() { + return this.app.workspace.getLeavesOfType(VIEW_TYPE).some((leaf) => { + return typeof leaf.view?.hasFocusedComposer === "function" && leaf.view.hasFocusedComposer(); + }); + } + + hasHoveredTaskList() { + return this.app.workspace.getLeavesOfType(VIEW_TYPE).some((leaf) => { + return typeof leaf.view?.hasHoveredTaskList === "function" && leaf.view.hasHoveredTaskList(); + }); + } + + setComposerFocused(isFocused) { + this.composerFocused = Boolean(isFocused); + if (this.composerFocused) { + window.clearTimeout(this.viewRefreshTimer); + return; + } + + if (!this.pendingViewRefresh) { + return; + } + + window.clearTimeout(this.viewRefreshTimer); + this.viewRefreshTimer = window.setTimeout(() => { + if (this.pendingViewRefresh && !this.hasFocusedComposer() && !this.hasHoveredTaskList()) { + this.requestViewRefresh({ force: true }); + } + }, 0); + } + + setTaskListHovered(isHovered) { + this.taskListHovered = Boolean(isHovered); + if (this.taskListHovered) { + window.clearTimeout(this.viewRefreshTimer); + return; + } + + if (!this.pendingViewRefresh) { + return; + } + + window.clearTimeout(this.viewRefreshTimer); + this.viewRefreshTimer = window.setTimeout(() => { + if (this.pendingViewRefresh && !this.hasFocusedComposer() && !this.hasHoveredTaskList()) { + this.requestViewRefresh({ force: true }); + } + }, 0); + } + + requestViewRefresh(options = {}) { + const force = options.force === true; + const streamTask = options.streamTask || null; + if (!force && streamTask) { + const patchedAnyView = this.app.workspace.getLeavesOfType(VIEW_TYPE).some((leaf) => { + return typeof leaf.view?.tryApplyStreamingTaskUpdate === "function" + && leaf.view.tryApplyStreamingTaskUpdate(streamTask); + }); + if (patchedAnyView) { + this.pendingViewRefresh = false; + window.clearTimeout(this.viewRefreshTimer); + return; + } + } + + if (!force && (this.composerFocused || this.hasFocusedComposer() || this.taskListHovered || this.hasHoveredTaskList())) { + this.pendingViewRefresh = true; + window.clearTimeout(this.viewRefreshTimer); + return; + } + + this.pendingViewRefresh = false; + window.clearTimeout(this.viewRefreshTimer); + this.viewRefreshTimer = window.setTimeout(() => { + this.app.workspace.getLeavesOfType(VIEW_TYPE).forEach((leaf) => { + if (leaf.view?.render) { + leaf.view.render(); + } + }); + }, 50); + } + + async refreshTasks() { + try { + const response = await this.api.getTasks({ vaultId: this.vaultId }); + this.runtimeIssue = ""; + const previousTasksById = this.tasksById; + const nextTasksById = {}; + const liveTasksById = this.tasksById; + + for (const rawTask of response.tasks || []) { + const taskId = String(rawTask?.taskId || "").trim(); + if (!taskId) { + continue; + } + + const nextTask = this.normalizeTaskForStore( + rawTask, + previousTasksById[taskId] || liveTasksById[taskId] || null + ); + if (!nextTask) { + continue; + } + + nextTasksById[taskId] = nextTask; + } + + Object.values(liveTasksById).forEach((task) => { + const taskId = String(task?.taskId || "").trim(); + if (!taskId || nextTasksById[taskId] || !this.isTaskForCurrentVault(task)) { + return; + } + nextTasksById[taskId] = task; + }); + + this.tasksById = nextTasksById; + this.pruneUnreadTaskState(); + this.syncActiveTaskToCanvasContext(); + Object.values(this.tasksById).forEach((task) => { + const previousTask = previousTasksById[task.taskId] || null; + this.maybeSyncCanvasNodeHighlights(task, previousTask); + this.maybeSyncTaskResultNode(task, previousTask); + }); + this.reconcileRunningTaskStreams(); + this.reconcileAllCanvasNodeHighlights(); + + await this.persistPluginState(); + this.requestViewRefresh(); + const activeTask = this.getActiveTask(); + if (activeTask && !this.taskHasLoadedMessages(activeTask)) { + void this.hydrateTaskDetails(activeTask.taskId, { force: true }); + } + } catch (error) { + this.runtimeIssue = String(error?.message || error); + this.requestViewRefresh(); + } + } + + async refreshTask(taskId, options = {}) { + if (!taskId) { + return; + } + + try { + const response = await this.api.getTask(taskId); + this.mergeTask(response.task, { + adoptCurrentVault: options.adoptCurrentVault === true, + }); + this.requestViewRefresh(options); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + this.requestViewRefresh(options); + } + } + + async hydrateTaskDetails(taskId, options = {}) { + const normalizedTaskId = String(taskId || "").trim(); + if (!normalizedTaskId) { + return; + } + + const task = this.tasksById[normalizedTaskId] || null; + if (!task || this.taskHasLoadedMessages(task) || this.taskDetailRefreshInFlight.has(normalizedTaskId)) { + return; + } + + this.taskDetailRefreshInFlight.add(normalizedTaskId); + try { + await this.refreshTask(normalizedTaskId, options); + } finally { + this.taskDetailRefreshInFlight.delete(normalizedTaskId); + } + } + + clearActiveStreamReconnectTimer() { + if (this.activeStreamReconnectTimer != null) { + window.clearTimeout(this.activeStreamReconnectTimer); + this.activeStreamReconnectTimer = null; + } + } + + disposeActiveStream() { + this.clearActiveStreamReconnectTimer(); + const disposer = this.activeStreamDisposer; + this.activeStreamDisposer = null; + this.activeStreamTaskId = ""; + this.activeStreamSessionId += 1; + if (typeof disposer === "function") { + disposer(); + } + } + + clearRunningTaskStreamReconnectTimer(taskId) { + const normalizedTaskId = String(taskId || "").trim(); + const existingTimer = normalizedTaskId ? this.runningTaskStreamReconnectTimers.get(normalizedTaskId) : null; + if (existingTimer != null) { + window.clearTimeout(existingTimer); + this.runningTaskStreamReconnectTimers.delete(normalizedTaskId); + } + } + + disposeRunningTaskStream(taskId, options = {}) { + const normalizedTaskId = String(taskId || "").trim(); + if (!normalizedTaskId) { + return; + } + + this.clearRunningTaskStreamReconnectTimer(normalizedTaskId); + const disposer = this.runningTaskStreamDisposers.get(normalizedTaskId) || null; + this.runningTaskStreamDisposers.delete(normalizedTaskId); + if (options.clearSession !== false) { + delete this.runningTaskStreamSessionIds[normalizedTaskId]; + } + if (typeof disposer === "function") { + disposer(); + } + } + + disposeAllRunningTaskStreams() { + Array.from(new Set([ + ...this.runningTaskStreamDisposers.keys(), + ...this.runningTaskStreamReconnectTimers.keys(), + ...Object.keys(this.runningTaskStreamSessionIds || {}), + ])).forEach((taskId) => { + this.disposeRunningTaskStream(taskId); + }); + } + + shouldWatchRunningTaskStream(taskId) { + const normalizedTaskId = String(taskId || "").trim(); + if (!normalizedTaskId || normalizedTaskId === String(this.activeStreamTaskId || "").trim()) { + return false; + } + + const task = this.tasksById[normalizedTaskId] || null; + return Boolean(task) && this.isTaskRunning(task); + } + + isRunningTaskStreamSessionCurrent(taskId, sessionId) { + const normalizedTaskId = String(taskId || "").trim(); + return Boolean(normalizedTaskId) + && this.shouldWatchRunningTaskStream(normalizedTaskId) + && Number(this.runningTaskStreamSessionIds[normalizedTaskId] || 0) === Number(sessionId || 0); + } + + scheduleRunningTaskStreamReconnect(taskId, sessionId) { + const normalizedTaskId = String(taskId || "").trim(); + if (!this.isRunningTaskStreamSessionCurrent(normalizedTaskId, sessionId)) { + return; + } + + this.clearRunningTaskStreamReconnectTimer(normalizedTaskId); + const timer = window.setTimeout(() => { + this.runningTaskStreamReconnectTimers.delete(normalizedTaskId); + if (!this.isRunningTaskStreamSessionCurrent(normalizedTaskId, sessionId)) { + return; + } + + this.connectRunningTaskStream(normalizedTaskId, sessionId); + }, ACTIVE_TASK_STREAM_RECONNECT_DELAY_MS); + this.runningTaskStreamReconnectTimers.set(normalizedTaskId, timer); + } + + connectRunningTaskStream(taskId, sessionId) { + const normalizedTaskId = String(taskId || "").trim(); + if (!this.isRunningTaskStreamSessionCurrent(normalizedTaskId, sessionId)) { + return; + } + + try { + this.runningTaskStreamDisposers.set(normalizedTaskId, this.api.openTaskStream(normalizedTaskId, { + onEvent: (_event, payload) => { + if (!this.isRunningTaskStreamSessionCurrent(normalizedTaskId, sessionId)) { + return; + } + + if (payload?.task) { + this.runtimeIssue = ""; + this.mergeTask(payload.task); + this.requestViewRefresh(); + } + }, + onClose: () => { + if (!this.isRunningTaskStreamSessionCurrent(normalizedTaskId, sessionId)) { + return; + } + + this.runningTaskStreamDisposers.delete(normalizedTaskId); + void this.refreshTask(normalizedTaskId, { force: true }) + .catch(() => {}) + .finally(() => { + this.scheduleRunningTaskStreamReconnect(normalizedTaskId, sessionId); + }); + }, + })); + } catch (error) { + if (!this.isRunningTaskStreamSessionCurrent(normalizedTaskId, sessionId)) { + return; + } + + this.runtimeIssue = String(error?.message || error); + this.requestViewRefresh(); + this.scheduleRunningTaskStreamReconnect(normalizedTaskId, sessionId); + } + } + + ensureRunningTaskStream(taskId) { + const normalizedTaskId = String(taskId || "").trim(); + if (!this.shouldWatchRunningTaskStream(normalizedTaskId)) { + this.disposeRunningTaskStream(normalizedTaskId); + return; + } + + if ( + this.runningTaskStreamDisposers.has(normalizedTaskId) + || this.runningTaskStreamReconnectTimers.has(normalizedTaskId) + ) { + return; + } + + const nextSessionId = Number(this.runningTaskStreamSessionIds[normalizedTaskId] || 0) + 1; + this.runningTaskStreamSessionIds[normalizedTaskId] = nextSessionId; + this.connectRunningTaskStream(normalizedTaskId, nextSessionId); + } + + reconcileRunningTaskStreams() { + const watchedTaskIds = new Set( + this.getTasks() + .filter((task) => this.shouldWatchRunningTaskStream(task?.taskId)) + .map((task) => String(task.taskId || "").trim()) + .filter(Boolean) + ); + + Array.from(new Set([ + ...this.runningTaskStreamDisposers.keys(), + ...this.runningTaskStreamReconnectTimers.keys(), + ...Object.keys(this.runningTaskStreamSessionIds || {}), + ])).forEach((taskId) => { + if (!watchedTaskIds.has(taskId)) { + this.disposeRunningTaskStream(taskId); + } + }); + + watchedTaskIds.forEach((taskId) => { + this.ensureRunningTaskStream(taskId); + }); + } + + isActiveStreamSessionCurrent(taskId, sessionId) { + const normalizedTaskId = String(taskId || "").trim(); + return Boolean(normalizedTaskId) + && normalizedTaskId === String(this.activeStreamTaskId || "").trim() + && normalizedTaskId === String(this.uiState?.activeTaskId || "").trim() + && sessionId === this.activeStreamSessionId; + } + + scheduleActiveStreamReconnect(taskId, sessionId) { + if (!this.isActiveStreamSessionCurrent(taskId, sessionId)) { + return; + } + + this.clearActiveStreamReconnectTimer(); + this.activeStreamReconnectTimer = window.setTimeout(() => { + this.activeStreamReconnectTimer = null; + if (!this.isActiveStreamSessionCurrent(taskId, sessionId)) { + return; + } + + this.connectActiveTaskStream(taskId, sessionId); + }, ACTIVE_TASK_STREAM_RECONNECT_DELAY_MS); + } + + connectActiveTaskStream(taskId, sessionId) { + if (!this.isActiveStreamSessionCurrent(taskId, sessionId)) { + return; + } + + try { + this.activeStreamDisposer = this.api.openTaskStream(taskId, { + onEvent: (_event, payload) => { + if (!this.isActiveStreamSessionCurrent(taskId, sessionId)) { + return; + } + + if (payload?.task) { + this.runtimeIssue = ""; + const task = this.mergeTask(payload.task); + this.requestViewRefresh({ streamTask: task }); + } + }, + onClose: () => { + if (!this.isActiveStreamSessionCurrent(taskId, sessionId)) { + return; + } + + this.activeStreamDisposer = null; + void this.refreshTask(taskId, { force: true }) + .catch(() => {}) + .finally(() => { + this.scheduleActiveStreamReconnect(taskId, sessionId); + }); + }, + }); + } catch (error) { + if (!this.isActiveStreamSessionCurrent(taskId, sessionId)) { + return; + } + + this.runtimeIssue = String(error?.message || error); + this.requestViewRefresh(); + this.scheduleActiveStreamReconnect(taskId, sessionId); + } + } + + subscribeToTask(taskId) { + this.disposeActiveStream(); + if (!taskId) { + this.reconcileRunningTaskStreams(); + return; + } + + this.activeStreamTaskId = String(taskId || "").trim(); + this.activeStreamSessionId += 1; + this.connectActiveTaskStream(this.activeStreamTaskId, this.activeStreamSessionId); + this.reconcileRunningTaskStreams(); + } + + async setActiveTask(taskId, options = {}) { + const normalizedTaskId = String(taskId || "").trim() || null; + this.uiState.activeTaskId = normalizedTaskId; + if (normalizedTaskId && options.markRead !== false) { + this.updateTaskUnreadState(normalizedTaskId, false); + } + if (options.revealInActiveTab) { + this.uiState.panelTab = PANEL_TAB_OPTIONS.TASK_LIST; + } + this.uiState.taskDetailOpen = options.showDetail === true; + await this.persistPluginState(); + this.subscribeToTask(normalizedTaskId); + this.requestViewRefresh(); + void this.hydrateTaskDetails(normalizedTaskId, { force: true }); + } + + async handleNewThreadFromSelectionCommand() { + await this.runActiveSelection({ forceNewTask: true }); + } + + async runActiveSelection(options = {}) { + const selection = await this.resolveSelectionForAction(); + return this.runResolvedSelection(selection, options); + } + + async runResolvedSelection(selection, options = {}) { + try { + let effectiveSelection = selection; + if (options.forceNewTask === true) { + effectiveSelection = await this.resolver.addImplicitCanvasFileContext(selection); + const followUpResult = await this.runSelectionAsFollowUp(effectiveSelection); + if (followUpResult) { + if (followUpResult.cancelled) { + await this.appendDebugEvent("follow_up_cancelled", { + taskId: followUpResult.task?.taskId || "", + sourceNodeId: effectiveSelection.nodeIds?.[0] || "", + }); + return; + } + await this.appendDebugEvent("follow_up_requested", { + taskId: followUpResult.task.taskId, + message: followUpResult.message, + sourceNodeId: effectiveSelection.nodeIds?.[0] || "", + mode: followUpResult.mode || "follow-up", + }); + this.runtimeIssue = ""; + await this.setActiveTask(followUpResult.task.taskId, { revealInActiveTab: true }); + new Notice( + followUpResult.mode === "fork" + ? "Forked this Canvas branch into a new OpenAgent thread." + : "Sent this selection to the existing OpenAgent thread." + ); + await this.refreshTask(followUpResult.task.taskId, { force: true }); + return; + } + } + + this.rememberSelectionSnapshot(effectiveSelection); + await this.appendDebugEvent("selection_resolved", { + mode: options.forceNewTask === true ? "new-thread" : "selection", + canvasPath: effectiveSelection.canvasPath, + nodeIds: effectiveSelection.nodeIds, + textCount: effectiveSelection.textBlocks?.length || 0, + fileCount: effectiveSelection.markdownFiles?.length || 0, + imageCount: effectiveSelection.imageFiles?.length || 0, + }); + const selectionSummary = this.summarizeSelection(effectiveSelection); + const inferredCwd = this.resolveWorkspaceRepoPathForSelection(effectiveSelection) || this.resolver.inferWorkingDirectory(effectiveSelection); + await this.appendDebugEvent("raw_prompt_prepared", { + promptPreview: options.forceNewTask === true + ? this.truncateInline(this.getNewThreadPromptFromSelection(effectiveSelection, { cwd: inferredCwd }), 180) + : "", + cwd: inferredCwd, + }); + await this.activateView(); + + const rawPrompt = this.getNewThreadPromptFromSelection(effectiveSelection, { cwd: inferredCwd }); + const response = await this.api.createTaskFromCanvasSelection(this.withVaultScope({ + ...effectiveSelection, + cwd: inferredCwd, + forceNewTask: options.forceNewTask === true, + runtimeConfig: this.buildRuntimeConfigPayload(), + })); + const task = this.mergeTask(response.task, { adoptCurrentVault: true }); + await this.appendDebugEvent("task_created", { + taskId: task.taskId, + threadId: task.threadId || "", + cwd: task.cwd, + selectionKey: task.selectionKey, + }); + this.runtimeIssue = ""; + await this.setActiveTask(task.taskId, { revealInActiveTab: true }); + + if (!task.cwd) { + new Notice( + selectionSummary + ? `${selectionSummary}. Set a working directory in the OpenAgent panel to continue.` + : "Set a working directory in the OpenAgent panel to continue." + ); + return; + } + + new Notice( + options.forceNewTask === true + ? "Starting a new OpenAgent thread." + : "OpenAgent is ready for this selection." + ); + + const runResponse = await this.api.runTask(task.taskId, { + rawPrompt, + transcriptMessage: rawPrompt, + forceContext: false, + runtimeConfig: this.buildRuntimeConfigPayload(), + }); + this.mergeTask(runResponse.task, { adoptCurrentVault: true }); + await this.appendDebugEvent("run_requested", { + taskId: task.taskId, + rawPrompt, + }); + await this.refreshTask(task.taskId); + const refreshedTask = this.tasksById[task.taskId] || task; + await this.appendDebugEvent("task_refreshed", { + taskId: refreshedTask.taskId, + threadId: refreshedTask.threadId || "", + status: refreshedTask.status || "", + lastMessage: Array.isArray(refreshedTask.messages) && refreshedTask.messages.length > 0 + ? String(refreshedTask.messages[refreshedTask.messages.length - 1]?.text || "") + : "", + }); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + await this.appendDebugEvent("new_thread_error", { + message: this.runtimeIssue, + }); + new Notice(this.runtimeIssue); + this.requestViewRefresh(); + } + } + + async resolveSelectionForAction() { + try { + const selection = await this.resolver.resolveActiveSelection(); + this.rememberSelectionSnapshot(selection); + return selection; + } catch (error) { + if (!this.isMissingSelectionError(error)) { + throw error; + } + + const fallbackSelection = await this.resolveRecentSelectionSnapshot(); + this.rememberSelectionSnapshot(fallbackSelection); + new Notice("Using the most recent Canvas selection."); + return fallbackSelection; + } + } + + isMissingSelectionError(error) { + const message = String(error?.message || error || ""); + return message.includes("Select one or more Canvas nodes first."); + } + + scheduleCanvasSelectionSnapshotCapture(view = null, options = {}) { + const delayMs = Math.max(0, toFiniteNumber(options.delayMs, 0)); + window.clearTimeout(this.canvasSelectionCaptureTimer); + this.canvasSelectionCaptureTimer = window.setTimeout(() => { + this.canvasSelectionCaptureTimer = null; + this.captureCanvasSelectionSnapshot(view); + }, delayMs); + } + + captureCanvasSelectionSnapshot(viewOverride = null) { + try { + const view = viewOverride?.getViewType?.() === "canvas" + ? viewOverride + : this.resolver.getActiveCanvasView(); + if (!view) { + return; + } + + this.ensureCanvasSelectionTrackingPatched(view); + this.ensureCanvasPopupMenuPatched(view); + this.syncCanvasPopupActionButtons(view); + + const file = view.file || this.app.workspace.getActiveFile(); + if (!(file instanceof TFile) || file.extension !== "canvas") { + return; + } + + const nodeIds = this.resolver.extractSelectedNodeIds(view); + const previousSnapshot = this.lastCanvasSelectionSnapshot; + if (nodeIds.length === 0) { + const didClearSelection = ( + previousSnapshot?.canvasPath === file.path + && Array.isArray(previousSnapshot?.nodeIds) + && previousSnapshot.nodeIds.length > 0 + ); + this.lastCanvasSelectionSnapshot = { + canvasPath: file.path, + nodeIds: [], + selectionIdentity: "", + capturedAt: Date.now(), + selectedNodeType: "", + selectedNodeLabel: "", + }; + if (didClearSelection) { + this.syncActiveTaskToCanvasContext(); + void this.refreshSelectedGroupContextPreview({ force: true }); + this.requestViewRefresh(); + } + return; + } + + const liveNodeDataById = this.resolver.extractLiveSelectedNodeDataById(view, nodeIds); + const selectedNode = nodeIds.length === 1 ? liveNodeDataById.get(String(nodeIds[0] || "")) || null : null; + const nextSnapshot = { + canvasPath: file.path, + nodeIds: Array.from(new Set(nodeIds.map((nodeId) => String(nodeId)).filter(Boolean))).sort(), + selectionIdentity: this.buildTaskSelectionIdentityFromNodeIds(file.path, nodeIds), + capturedAt: Date.now(), + selectedNodeType: String(selectedNode?.type || "").trim(), + selectedNodeLabel: String(selectedNode?.label || "").trim(), + }; + const selectionUnchanged = ( + previousSnapshot?.canvasPath === nextSnapshot.canvasPath + && previousSnapshot?.selectionIdentity === nextSnapshot.selectionIdentity + && Array.isArray(previousSnapshot?.nodeIds) + && previousSnapshot.nodeIds.length === nextSnapshot.nodeIds.length + && previousSnapshot.nodeIds.every((nodeId, index) => nodeId === nextSnapshot.nodeIds[index]) + && String(previousSnapshot?.selectedNodeType || "") === nextSnapshot.selectedNodeType + && String(previousSnapshot?.selectedNodeLabel || "") === nextSnapshot.selectedNodeLabel + ); + this.lastCanvasSelectionSnapshot = nextSnapshot; + if (!selectionUnchanged) { + this.syncActiveTaskToCanvasContext({ markReadOnSelection: true }); + void this.refreshSelectedGroupContextPreview({ snapshot: nextSnapshot, force: true }); + this.requestViewRefresh(); + } + } catch { + // Ignore transient Canvas introspection failures during selection sync. + } + } + + async resolveRecentSelectionSnapshot() { + const snapshot = this.lastCanvasSelectionSnapshot; + if (!snapshot?.canvasPath || !Array.isArray(snapshot.nodeIds) || snapshot.nodeIds.length === 0) { + throw new Error("Select one or more Canvas nodes first."); + } + + if (Date.now() - Number(snapshot.capturedAt || 0) > RECENT_SELECTION_TTL_MS) { + throw new Error("Select one or more Canvas nodes first."); + } + + const abstractFile = this.app.vault.getAbstractFileByPath(snapshot.canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + throw new Error("The recent Canvas selection is no longer available."); + } + + return this.resolver.resolveCanvasSelection(abstractFile, snapshot.nodeIds); + } + + rememberSelectionSnapshot(selection) { + const canvasPath = String(selection?.canvasPath || "").trim(); + const nodeIds = Array.isArray(selection?.nodeIds) ? selection.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) : []; + if (!canvasPath || nodeIds.length === 0) { + return; + } + + this.lastCanvasSelectionSnapshot = { + canvasPath, + nodeIds: Array.from(new Set(nodeIds)).sort(), + selectionIdentity: this.buildTaskSelectionIdentityFromNodeIds(canvasPath, nodeIds), + capturedAt: Date.now(), + selectedNodeType: "", + selectedNodeLabel: "", + }; + this.syncActiveTaskToCanvasContext(); + void this.refreshSelectedGroupContextPreview({ force: true }); + } + + getRecentSelectionSnapshotForActiveCanvas() { + const snapshot = this.lastCanvasSelectionSnapshot; + const activeCanvasPath = this.getActiveCanvasPath(); + if (!snapshot?.canvasPath || !activeCanvasPath || snapshot.canvasPath !== activeCanvasPath) { + return null; + } + + const nodeIds = Array.isArray(snapshot.nodeIds) + ? snapshot.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + if (nodeIds.length === 0) { + return null; + } + + if (Date.now() - Number(snapshot.capturedAt || 0) > RECENT_SELECTION_TTL_MS) { + return null; + } + + return { + ...snapshot, + nodeIds, + }; + } + + buildSelectedGroupContextPreviewKey(snapshot = null) { + const targetSnapshot = snapshot || this.getRecentSelectionSnapshotForActiveCanvas(); + if (!targetSnapshot?.canvasPath || !Array.isArray(targetSnapshot.nodeIds) || targetSnapshot.nodeIds.length !== 1) { + return ""; + } + + if (String(targetSnapshot.selectedNodeType || "").trim() !== "group") { + return ""; + } + + return `${targetSnapshot.canvasPath}::${targetSnapshot.nodeIds[0]}`; + } + + buildLoadingSelectedGroupContextPreview(snapshot) { + if (!snapshot?.canvasPath) { + return null; + } + + return { + status: "loading", + canvasPath: snapshot.canvasPath, + groupNodeId: Array.isArray(snapshot.nodeIds) ? String(snapshot.nodeIds[0] || "").trim() : "", + groupLabel: String(snapshot.selectedNodeLabel || "").trim() || "Untitled group", + textBlocks: [], + markdownFiles: [], + warnings: [], + }; + } + + async readCanvasMarkdownFilePreviewEntry(node, warnings = []) { + const filePath = typeof node?.file === "string" ? node.file.trim() : ""; + const abstractFile = await this.resolver.waitForCanvasFile(filePath, { timeoutMs: 0 }); + if (!(abstractFile instanceof TFile)) { + warnings.push(`Missing file node target: ${filePath}`); + return null; + } + + if (abstractFile.extension !== "md") { + warnings.push(`Unsupported file node type skipped: ${filePath}`); + return null; + } + + const vaultBasePath = this.getVaultBasePath(); + return { + id: String(node?.id || ""), + path: abstractFile.path, + absolutePath: vaultBasePath + ? this.resolver.resolveVaultPath(vaultBasePath, abstractFile.path) + : "", + name: abstractFile.basename, + }; + } + + async buildSelectedGroupContextPreview(snapshot) { + const canvasPath = String(snapshot?.canvasPath || "").trim(); + const groupNodeId = Array.isArray(snapshot?.nodeIds) ? String(snapshot.nodeIds[0] || "").trim() : ""; + if (!canvasPath || !groupNodeId) { + return null; + } + + const abstractFile = this.app.vault.getAbstractFileByPath(canvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + return null; + } + + let parsed; + try { + parsed = JSON.parse(await this.app.vault.cachedRead(abstractFile)); + } catch { + return null; + } + + const nodeById = new Map( + (Array.isArray(parsed?.nodes) ? parsed.nodes : []).map((node) => [String(node?.id || "").trim(), node]) + ); + const selectedNode = nodeById.get(groupNodeId) || null; + if (String(selectedNode?.type || "") !== "group") { + return null; + } + + const containedNodes = Array.from(nodeById.values()) + .filter((node) => { + const nodeId = String(node?.id || "").trim(); + return nodeId && nodeId !== groupNodeId && this.resolver.doesCanvasGroupContainNode(selectedNode, node); + }) + .sort(compareCanvasNodeOrder); + + const textBlocks = []; + const markdownFiles = []; + const warnings = []; + const previewEntries = await Promise.all(containedNodes.map(async (node) => { + const nodeId = String(node?.id || "").trim(); + if (!nodeId) { + return null; + } + + if (String(node?.type || "") === "text") { + const text = typeof node?.text === "string" ? node.text.trim() : ""; + return text ? { kind: "text", value: { id: nodeId, text } } : null; + } + + if (String(node?.type || "") === "file") { + const nodeWarnings = []; + const markdownFile = await this.readCanvasMarkdownFilePreviewEntry(node, nodeWarnings); + return { + kind: "file", + value: markdownFile, + warnings: nodeWarnings, + }; + } + + return null; + })); + + previewEntries.forEach((entry) => { + if (!entry) { + return; + } + + if (entry.kind === "text" && entry.value) { + textBlocks.push(entry.value); + } + + if (entry.kind === "file" && entry.value) { + markdownFiles.push(entry.value); + } + + if (Array.isArray(entry.warnings) && entry.warnings.length > 0) { + warnings.push(...entry.warnings); + } + }); + + return { + status: "ready", + canvasPath, + groupNodeId, + groupLabel: String(selectedNode?.label || "").trim() || String(snapshot?.selectedNodeLabel || "").trim() || "Untitled group", + textBlocks, + markdownFiles, + warnings, + }; + } + + async refreshSelectedGroupContextPreview(options = {}) { + const snapshot = options.snapshot || this.getRecentSelectionSnapshotForActiveCanvas(); + const nextKey = this.buildSelectedGroupContextPreviewKey(snapshot); + if (!nextKey) { + const didChange = this.selectedGroupContextPreviewState.key || this.selectedGroupContextPreviewState.preview || this.selectedGroupContextPreviewState.loading; + this.selectedGroupContextPreviewState = { + key: "", + preview: null, + loading: false, + }; + if (didChange) { + this.requestViewRefresh(); + } + return null; + } + + if ( + options.force !== true + && this.selectedGroupContextPreviewState.key === nextKey + && (this.selectedGroupContextPreviewState.loading || this.selectedGroupContextPreviewState.preview) + ) { + return this.selectedGroupContextPreviewState.preview; + } + + this.selectedGroupContextPreviewState = { + key: nextKey, + preview: this.buildLoadingSelectedGroupContextPreview(snapshot), + loading: true, + }; + this.requestViewRefresh(); + + const loadPromise = this.buildSelectedGroupContextPreview(snapshot) + .then((preview) => { + if (this.selectedGroupContextPreviewState.key !== nextKey) { + return preview; + } + + this.selectedGroupContextPreviewState = { + key: nextKey, + preview, + loading: false, + }; + this.requestViewRefresh(); + return preview; + }) + .catch(() => { + if (this.selectedGroupContextPreviewState.key === nextKey) { + this.selectedGroupContextPreviewState = { + key: nextKey, + preview: null, + loading: false, + }; + this.requestViewRefresh(); + } + return null; + }) + .finally(() => { + if (this.selectedGroupContextPreviewLoadPromise === loadPromise) { + this.selectedGroupContextPreviewLoadPromise = null; + } + }); + + this.selectedGroupContextPreviewLoadPromise = loadPromise; + return loadPromise; + } + + handleSelectedGroupContextDependencyMutation(file, oldPath = "") { + const snapshot = this.getRecentSelectionSnapshotForActiveCanvas(); + const previewKey = this.buildSelectedGroupContextPreviewKey(snapshot); + if (!previewKey) { + return; + } + + const nextPath = file instanceof TFile ? String(file.path || "").trim() : ""; + const normalizedOldPath = String(oldPath || "").trim(); + const preview = this.selectedGroupContextPreviewState.preview; + const dependsOnCurrentFile = [nextPath, normalizedOldPath].some((candidatePath) => { + if (!candidatePath) { + return false; + } + + if (candidatePath === snapshot.canvasPath) { + return true; + } + + return Array.isArray(preview?.markdownFiles) && preview.markdownFiles.some((markdownFile) => markdownFile?.path === candidatePath); + }); + if (!dependsOnCurrentFile) { + return; + } + + void this.refreshSelectedGroupContextPreview({ snapshot, force: true }); + } + + getSelectedGroupContextPreview() { + const snapshot = this.getRecentSelectionSnapshotForActiveCanvas(); + const previewKey = this.buildSelectedGroupContextPreviewKey(snapshot); + if (!previewKey) { + return null; + } + + if (this.selectedGroupContextPreviewState.key !== previewKey) { + void this.refreshSelectedGroupContextPreview({ snapshot }); + return this.buildLoadingSelectedGroupContextPreview(snapshot); + } + + return this.selectedGroupContextPreviewState.preview || this.buildLoadingSelectedGroupContextPreview(snapshot); + } + + getActiveCanvasPath() { + const view = this.resolver.getActiveCanvasView(); + const file = view?.file || this.app.workspace.getActiveFile(); + return file instanceof TFile && file.extension === "canvas" ? file.path : ""; + } + + getCanvasAbsolutePath(canvasPath) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const vaultBasePath = this.getVaultBasePath(); + if (!normalizedCanvasPath || !vaultBasePath) { + return ""; + } + + return path.join(vaultBasePath, ...normalizedCanvasPath.split("/")); + } + + async autoArrangeActiveCanvas() { + try { + const view = this.resolver.getActiveCanvasView(); + if (!view) { + throw new Error("Open a Canvas view first."); + } + + const file = view.file || this.app.workspace.getActiveFile(); + if (!(file instanceof TFile) || file.extension !== "canvas") { + throw new Error("The active view is not backed by a .canvas file."); + } + + await this.resolver.flushPendingCanvasEdits(view); + const result = await this.withSerializedCanvasMutation(file.path, async () => { + const raw = await this.app.vault.cachedRead(file); + let parsed; + try { + parsed = JSON.parse(raw); + } catch { + throw new Error(`Unable to parse canvas JSON for ${file.path}`); + } + + const nodes = Array.isArray(parsed?.nodes) ? parsed.nodes : []; + const edges = Array.isArray(parsed?.edges) ? parsed.edges : []; + if (nodes.length === 0) { + throw new Error("This Canvas has no nodes to arrange."); + } + + const arrangedNodes = autoArrangeCanvasNodes(nodes, edges); + const changed = arrangedNodes.some((node, index) => { + const previousNode = nodes[index] || {}; + return ( + toFiniteNumber(node?.x, 0) !== toFiniteNumber(previousNode?.x, 0) + || toFiniteNumber(node?.y, 0) !== toFiniteNumber(previousNode?.y, 0) + ); + }); + if (!changed) { + return { changed: false, parsed }; + } + + const nextParsed = { + ...parsed, + nodes: arrangedNodes, + edges, + }; + await this.app.vault.modify(file, JSON.stringify(nextParsed, null, 2) + "\n"); + this.primeCanvasSnapshot(file.path, nextParsed); + return { + changed: true, + parsed: nextParsed, + nodeCount: arrangedNodes.length, + }; + }); + + this.runtimeIssue = ""; + this.scheduleCanvasNodeHighlightSync(file.path); + this.requestViewRefresh({ force: true }); + await this.appendDebugEvent("canvas_auto_arranged", { + canvasPath: file.path, + changed: result.changed, + nodeCount: result.nodeCount || 0, + }); + new Notice(result.changed + ? "Arranged Canvas nodes without changing edges." + : "Canvas nodes are already arranged."); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + await this.appendDebugEvent("canvas_auto_arrange_error", { + message: this.runtimeIssue, + }); + new Notice(this.runtimeIssue); + this.requestViewRefresh({ force: true }); + } + } + + buildCanvasSnapshot(parsed) { + const safeParsed = parsed && typeof parsed === "object" ? parsed : {}; + const nodes = Array.isArray(safeParsed.nodes) ? safeParsed.nodes : []; + const edges = Array.isArray(safeParsed.edges) ? safeParsed.edges : []; + const nodeIds = new Set(); + const nodeById = new Map(); + const incomingEdgesByNodeId = new Map(); + const resultSourceNodeIdByResultNodeId = new Map(); + + nodes.forEach((node) => { + const nodeId = String(node?.id || "").trim(); + if (!nodeId) { + return; + } + + nodeIds.add(nodeId); + nodeById.set(nodeId, node); + + const sourceNodeId = getOpenAgentResultSourceNodeId(node); + if (sourceNodeId) { + resultSourceNodeIdByResultNodeId.set(nodeId, sourceNodeId); + } + }); + + edges.forEach((edge) => { + const fromNodeId = String(edge?.fromNode || "").trim(); + const toNodeId = String(edge?.toNode || "").trim(); + if (!fromNodeId || !toNodeId) { + return; + } + + const incomingEdges = incomingEdgesByNodeId.get(toNodeId) || []; + incomingEdges.push(edge); + incomingEdgesByNodeId.set(toNodeId, incomingEdges); + + if (toNodeId.startsWith("oa-result-") && !resultSourceNodeIdByResultNodeId.has(toNodeId)) { + resultSourceNodeIdByResultNodeId.set(toNodeId, fromNodeId); + } + }); + + return { + parsed: safeParsed, + nodeIds, + nodeById, + incomingEdgesByNodeId, + resultSourceNodeIdByResultNodeId, + }; + } + + primeCanvasSnapshot(canvasPath, parsed) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + return null; + } + + const snapshot = this.buildCanvasSnapshot(parsed); + this.canvasSnapshotCacheByPath.set(normalizedCanvasPath, snapshot); + return snapshot; + } + + invalidateCanvasSnapshot(canvasPath) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + return; + } + + this.canvasSnapshotCacheByPath.delete(normalizedCanvasPath); + } + + getCanvasSnapshotSync(canvasPath) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + return null; + } + + if (this.canvasSnapshotCacheByPath.has(normalizedCanvasPath)) { + return this.canvasSnapshotCacheByPath.get(normalizedCanvasPath); + } + + const absoluteCanvasPath = this.getCanvasAbsolutePath(normalizedCanvasPath); + if (!absoluteCanvasPath || !fs.existsSync(absoluteCanvasPath)) { + this.canvasSnapshotCacheByPath.set(normalizedCanvasPath, null); + return null; + } + + try { + const parsed = JSON.parse(fs.readFileSync(absoluteCanvasPath, "utf8")); + return this.primeCanvasSnapshot(normalizedCanvasPath, parsed); + } catch { + this.canvasSnapshotCacheByPath.set(normalizedCanvasPath, null); + return null; + } + } + + normalizeCanvasNodeColorValue(value) { + return String(value || "").trim().toLowerCase(); + } + + isAutoRunTriggerCanvasNodeColor(value) { + const normalizedValue = this.normalizeCanvasNodeColorValue(value); + return normalizedValue !== "" && AUTO_RUN_TRIGGER_CANVAS_NODE_COLORS.includes(normalizedValue); + } + + isAutoRunnableCanvasNode(node) { + if (!node || typeof node !== "object" || isOpenAgentAssistantResultNode(node)) { + return false; + } + + const nodeType = String(node?.type || "").trim(); + return nodeType === "text" || nodeType === "file"; + } + + getAutoRunCandidateNodeIds(previousSnapshot, nextSnapshot) { + if (!nextSnapshot?.nodeById) { + return []; + } + + const nodeIds = Array.from(nextSnapshot.nodeById.keys()).filter((nodeId) => { + const nextNode = nextSnapshot.nodeById.get(nodeId); + if (!this.isAutoRunnableCanvasNode(nextNode)) { + return false; + } + + const nextColor = this.normalizeCanvasNodeColorValue(nextNode?.color); + if (!this.isAutoRunTriggerCanvasNodeColor(nextColor)) { + return false; + } + + const previousColor = this.normalizeCanvasNodeColorValue(previousSnapshot?.nodeById?.get(nodeId)?.color); + return !this.isAutoRunTriggerCanvasNodeColor(previousColor); + }); + + return nodeIds.sort((leftNodeId, rightNodeId) => { + return compareCanvasNodeOrder( + nextSnapshot.nodeById.get(leftNodeId), + nextSnapshot.nodeById.get(rightNodeId) + ); + }); + } + + async triggerAutoRunForCanvasNodes(canvasPath, nodeIds) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeIds = Array.from(new Set( + (Array.isArray(nodeIds) ? nodeIds : []) + .map((nodeId) => String(nodeId || "").trim()) + .filter(Boolean) + )); + if (!normalizedCanvasPath || normalizedNodeIds.length === 0) { + return; + } + + const abstractFile = this.app.vault.getAbstractFileByPath(normalizedCanvasPath); + if (!(abstractFile instanceof TFile) || abstractFile.extension !== "canvas") { + return; + } + + for (const nodeId of normalizedNodeIds) { + const autoRunKey = this.getCanvasNodeHighlightKey(normalizedCanvasPath, nodeId); + if (!autoRunKey || this.canvasAutoRunInFlightByKey.has(autoRunKey)) { + continue; + } + + const existingTask = this.findTaskByCanvasRunSourceNode(normalizedCanvasPath, nodeId) + || this.findTaskByRootCanvasNode(normalizedCanvasPath, nodeId); + if (existingTask && this.isTaskRunning(existingTask)) { + continue; + } + + this.canvasAutoRunInFlightByKey.add(autoRunKey); + try { + const selection = await this.resolver.resolveCanvasSelection(abstractFile, [nodeId]); + await this.appendDebugEvent("canvas_auto_run_triggered", { + canvasPath: normalizedCanvasPath, + nodeId, + title: selection.title, + }); + this.rememberSelectionSnapshot(selection); + await this.runResolvedSelection(selection, { forceNewTask: true }); + } catch (error) { + const message = String(error?.message || error); + await this.appendDebugEvent("canvas_auto_run_error", { + canvasPath: normalizedCanvasPath, + nodeId, + message, + }); + new Notice(`Auto-run failed for Canvas node ${nodeId}: ${message}`); + } finally { + this.canvasAutoRunInFlightByKey.delete(autoRunKey); + } + } + } + + async withSerializedCanvasMutation(canvasPath, operation) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + if (!normalizedCanvasPath) { + return operation(); + } + + const previous = this.canvasMutationQueueByPath.get(normalizedCanvasPath) || Promise.resolve(); + const next = previous + .catch(() => {}) + .then(() => operation()); + this.canvasMutationQueueByPath.set(normalizedCanvasPath, next); + + try { + return await next; + } finally { + if (this.canvasMutationQueueByPath.get(normalizedCanvasPath) === next) { + this.canvasMutationQueueByPath.delete(normalizedCanvasPath); + } + } + } + + getConversationSelectionNodeIds(canvasPath, nodeIds) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeIds = Array.from(new Set( + (Array.isArray(nodeIds) ? nodeIds : []) + .map((nodeId) => String(nodeId || "").trim()) + .filter(Boolean) + )).sort(); + if (!normalizedCanvasPath || normalizedNodeIds.length === 0) { + return []; + } + + if (!normalizedNodeIds.some((nodeId) => nodeId.startsWith("oa-result-"))) { + return normalizedNodeIds; + } + + const snapshot = this.getCanvasSnapshotSync(normalizedCanvasPath); + if (!snapshot) { + return normalizedNodeIds; + } + + return Array.from(new Set( + normalizedNodeIds.map((nodeId) => snapshot.resultSourceNodeIdByResultNodeId.get(nodeId) || nodeId) + )).sort(); + } + + buildTaskSelectionIdentityFromNodeIds(canvasPath, nodeIds) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const canonicalNodeIds = this.getConversationSelectionNodeIds(normalizedCanvasPath, nodeIds); + if (!normalizedCanvasPath || canonicalNodeIds.length === 0) { + return ""; + } + + return `${normalizedCanvasPath}\n${canonicalNodeIds.join("\n")}`; + } + + getTaskCanvasPath(task) { + return String(task?.canvasBinding?.canvasPath || task?.selectionContext?.canvasPath || task?.sourceRef || "").trim(); + } + + getTaskSelectionIdentity(task) { + const canvasPath = this.getTaskCanvasPath(task); + const nodeIds = Array.isArray(task?.selectionContext?.nodeIds) + ? task.selectionContext.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean).sort() + : []; + return this.buildTaskSelectionIdentityFromNodeIds(canvasPath, nodeIds); + } + + getRecentSelectionIdentityForCanvas(canvasPath) { + const snapshot = this.lastCanvasSelectionSnapshot; + if (!canvasPath || !snapshot || snapshot.canvasPath !== canvasPath) { + return ""; + } + + if (Date.now() - Number(snapshot.capturedAt || 0) > RECENT_SELECTION_TTL_MS) { + return ""; + } + + const nodeIds = Array.isArray(snapshot.nodeIds) + ? snapshot.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean).sort() + : []; + if (nodeIds.length === 0) { + return ""; + } + + return snapshot.selectionIdentity || this.buildTaskSelectionIdentityFromNodeIds(canvasPath, nodeIds); + } + + resolveFollowUpTaskForCanvasNodeIds(canvasPath, nodeIds) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const normalizedNodeIds = Array.from(new Set( + (Array.isArray(nodeIds) ? nodeIds : []) + .map((nodeId) => String(nodeId || "").trim()) + .filter(Boolean) + )).sort(); + if (!normalizedCanvasPath || normalizedNodeIds.length !== 1) { + return null; + } + + const selectedNodeId = normalizedNodeIds[0]; + if (!selectedNodeId) { + return null; + } + + if (selectedNodeId.startsWith("oa-result-")) { + return this.findTaskByOpenAgentResultNode(normalizedCanvasPath, selectedNodeId); + } + + const snapshot = this.getCanvasSnapshotSync(normalizedCanvasPath); + if (!snapshot) { + return null; + } + + const selectedNode = snapshot.nodeById.get(selectedNodeId); + if (!selectedNode || String(selectedNode?.type || "").trim() !== "text") { + return null; + } + + for (const edge of snapshot.incomingEdgesByNodeId.get(selectedNodeId) || []) { + const upstreamNodeId = String(edge?.fromNode || "").trim(); + const task = this.findConversationTaskForUpstreamNode(normalizedCanvasPath, upstreamNodeId); + if (task) { + return task; + } + } + + return null; + } + + getRecentSelectionTaskForCanvas(canvasPath) { + const snapshot = this.lastCanvasSelectionSnapshot; + if (!canvasPath || !snapshot || snapshot.canvasPath !== canvasPath) { + return null; + } + + if (Date.now() - Number(snapshot.capturedAt || 0) > RECENT_SELECTION_TTL_MS) { + return null; + } + + return this.resolveFollowUpTaskForCanvasNodeIds(canvasPath, snapshot.nodeIds); + } + + hasExplicitCanvasDeselection(canvasPath) { + const normalizedCanvasPath = String(canvasPath || "").trim(); + const snapshot = this.lastCanvasSelectionSnapshot; + if (!normalizedCanvasPath || !snapshot || snapshot.canvasPath !== normalizedCanvasPath) { + return false; + } + + if (Date.now() - Number(snapshot.capturedAt || 0) > RECENT_SELECTION_TTL_MS) { + return false; + } + + const nodeIds = Array.isArray(snapshot.nodeIds) + ? snapshot.nodeIds.map((nodeId) => String(nodeId)).filter(Boolean) + : []; + return nodeIds.length === 0; + } + + syncActiveTaskToCanvasContext(options = {}) { + const activeCanvasPath = this.getActiveCanvasPath(); + if (!activeCanvasPath) { + return; + } + + const archiveProbeCache = new Map(); + const visibleTasks = this.getVisibleTasks({ archiveProbeCache }); + const archivedTasks = this.getArchivedTasks({ archiveProbeCache }); + const selectedIdentity = this.getRecentSelectionIdentityForCanvas(activeCanvasPath); + const currentTask = this.tasksById[this.uiState.activeTaskId] || null; + let nextTask = null; + + if (selectedIdentity) { + nextTask = visibleTasks.find((task) => this.getTaskSelectionIdentity(task) === selectedIdentity) + || archivedTasks.find((task) => this.getTaskSelectionIdentity(task) === selectedIdentity) + || null; + + if (!nextTask) { + nextTask = this.getRecentSelectionTaskForCanvas(activeCanvasPath); + } + } else if (this.hasExplicitCanvasDeselection(activeCanvasPath)) { + nextTask = null; + } else { + if (currentTask && this.getTaskCanvasPath(currentTask) === activeCanvasPath) { + nextTask = currentTask; + } + + if (!nextTask && visibleTasks.length > 0) { + nextTask = visibleTasks[0]; + } + + if (!nextTask && archivedTasks.length > 0) { + nextTask = archivedTasks[0]; + } + } + + const nextTaskId = nextTask?.taskId || null; + const shouldMarkRead = options.markReadOnSelection === true + && nextTaskId + && this.hasUnreadTask(nextTaskId); + if (nextTaskId === this.uiState.activeTaskId) { + if (shouldMarkRead) { + this.setTaskUnreadState(nextTaskId, false); + } + return; + } + + this.uiState.activeTaskId = nextTaskId; + this.uiState.taskDetailOpen = false; + if (shouldMarkRead) { + this.updateTaskUnreadState(nextTaskId, false); + } + this.persistPluginState(); + if (nextTaskId) { + this.subscribeToTask(nextTaskId); + void this.hydrateTaskDetails(nextTaskId, { force: true }); + } else { + this.disposeActiveStream(); + } + this.reconcileRunningTaskStreams(); + this.requestViewRefresh(); + } + + async saveCwdForTask(taskId, cwd) { + const task = this.tasksById[taskId]; + if (!task?.selectionContext) { + new Notice("This task does not have enough selection context to change its project folder."); + return; + } + + const normalizedCwd = this.normalizeWorkingDirectoryInput(cwd); + if (!normalizedCwd) { + new Notice("Enter an absolute project folder path."); + return; + } + + try { + const response = await this.api.createTaskFromCanvasSelection(this.withVaultScope({ + ...task.selectionContext, + title: task.title, + cwd: normalizedCwd, + runtimeConfig: this.buildRuntimeConfigPayload(), + })); + const nextTask = this.mergeTask(response.task, { adoptCurrentVault: true }); + await this.setActiveTask(nextTask.taskId, { revealInActiveTab: true }); + this.runtimeIssue = ""; + new Notice(`Project folder set to ${nextTask.cwd || "(not set)"}`); + await this.refreshTask(nextTask.taskId); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + new Notice(this.runtimeIssue); + this.requestViewRefresh(); + } + } + + async sendDraftForTask(taskId, options = {}) { + const task = this.tasksById[taskId]; + if (task?.status === "running") { + new Notice("Wait for the current turn to finish before sending another message."); + return; + } + + const draftSource = Object.prototype.hasOwnProperty.call(options, "draft") + ? String(options.draft || "") + : this.getDraft(taskId); + if (Object.prototype.hasOwnProperty.call(options, "draft")) { + this.setDraft(taskId, draftSource); + } + + const draft = draftSource.trim(); + if (!draft) { + new Notice("Write a follow-up message first."); + return; + } + + try { + await this.api.sendMessage(taskId, draft, this.buildRuntimeConfigPayload()); + this.clearDraft(taskId); + await this.refreshTask(taskId, { force: true }); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + new Notice(this.runtimeIssue); + this.requestViewRefresh(); + } + } + + async resumeLastTask() { + await this.activateView(); + await this.refreshTasks(); + const task = this.getActiveTask() || this.getTasks()[0]; + if (!task) { + new Notice("No OpenAgent task yet."); + return; + } + + await this.activateTaskFromList(task.taskId); + } + + async stopActiveTask() { + const task = this.getActiveTask(); + if (!task?.currentTurnId) { + new Notice("No active turn to stop."); + return; + } + + try { + await this.api.interruptTask(task.taskId); + await this.refreshTask(task.taskId); + } catch (error) { + this.runtimeIssue = String(error?.message || error); + new Notice(this.runtimeIssue); + this.requestViewRefresh(); + } + } + + getStopActiveTaskHotkey() { + return normalizeStopHotkeySetting(this.settings?.stopActiveTaskHotkey); + } + + getStopActiveTaskHotkeyLabel() { + return formatHotkeyForDisplay(this.getStopActiveTaskHotkey()); + } + + getStopActiveTaskButtonTitle() { + const hotkey = this.getStopActiveTaskHotkeyLabel(); + return hotkey ? `Stop (${hotkey})` : "Stop"; + } + + async handleStopActiveTaskHotkey(event) { + if (!event || event.defaultPrevented || event.repeat) { + return; + } + if (event.isComposing || event.keyCode === 229) { + return; + } + if (isHotkeyCaptureTarget(event.target)) { + return; + } + if (!hotkeyMatchesKeyboardEvent(this.getStopActiveTaskHotkey(), event)) { + return; + } + + const task = this.getActiveTask(); + if (!task?.currentTurnId) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + await this.stopActiveTask(); + } + + normalizeWorkingDirectoryInput(cwd) { + const trimmedCwd = String(cwd || "").trim(); + if (!trimmedCwd || !path.isAbsolute(trimmedCwd)) { + return ""; + } + + return path.normalize(trimmedCwd); + } + + summarizeSelection(selection) { + const textCount = Array.isArray(selection?.textBlocks) ? selection.textBlocks.length : 0; + const fileCount = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles.length : 0; + const imageCount = Array.isArray(selection?.imageFiles) ? selection.imageFiles.length : 0; + const parts = []; + + if (textCount > 0) { + parts.push(`${textCount} text node${textCount === 1 ? "" : "s"}`); + } + + if (fileCount > 0) { + parts.push(`${fileCount} markdown file${fileCount === 1 ? "" : "s"}`); + } + + if (imageCount > 0) { + parts.push(`${imageCount} image file${imageCount === 1 ? "" : "s"}`); + } + + const firstText = selection?.textBlocks?.[0]?.text; + if (parts.length === 1 && textCount === 1 && typeof firstText === "string" && firstText.trim()) { + return `Captured ${parts[0]}: ${this.truncateInline(firstText.trim(), 80)}`; + } + + if (parts.length > 0) { + return `Captured ${parts.join(" and ")}`; + } + + return ""; + } + + getSelectionImageResourceUrl(file) { + const normalizedPath = String(file?.path || "").trim(); + if (!normalizedPath) { + return String(file?.absolutePath || "").trim(); + } + + const abstractFile = this.app.vault.getAbstractFileByPath(normalizedPath); + if (abstractFile instanceof TFile) { + if (typeof this.app.vault.getResourcePath === "function") { + try { + return this.app.vault.getResourcePath(abstractFile); + } catch { + // Fall through to adapter-based lookup. + } + } + + if (typeof this.app.vault.adapter?.getResourcePath === "function") { + try { + return this.app.vault.adapter.getResourcePath(normalizedPath); + } catch { + // Fall through to absolute path. + } + } + } + + return String(file?.absolutePath || "").trim(); + } + + renderSelectionImageMessage(container, selection) { + const imageFiles = Array.isArray(selection?.imageFiles) + ? selection.imageFiles.filter((file) => String(file?.path || file?.absolutePath || "").trim()) + : []; + if (imageFiles.length === 0) { + return null; + } + + const item = container.createDiv({ + cls: "oa-message oa-chat-message oa-role-user oa-selection-message", + }); + item.createDiv({ + cls: "oa-message-label", + text: imageFiles.length === 1 ? "Selected image" : "Selected images", + }); + + const gallery = item.createDiv({ cls: "oa-selection-image-gallery" }); + imageFiles.forEach((file, index) => { + const src = this.getSelectionImageResourceUrl(file); + const card = gallery.createDiv({ cls: "oa-selection-image-card" }); + if (src) { + card.createEl("img", { + cls: "oa-selection-image", + attr: { + src, + alt: String(file?.name || file?.path || `Selected image ${index + 1}`), + }, + }); + } else { + card.createDiv({ + cls: "oa-selection-image-fallback", + text: "Image preview unavailable", + }); + } + card.createDiv({ + cls: "oa-selection-image-caption", + text: String(file?.path || file?.name || `Image file ${index + 1}`), + }); + }); + + return item; + } + + describeSelectionDebug(selection) { + const nodeIds = Array.isArray(selection?.nodeIds) ? selection.nodeIds.filter(Boolean) : []; + const textCount = Array.isArray(selection?.textBlocks) ? selection.textBlocks.length : 0; + const fileCount = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles.length : 0; + const imageCount = Array.isArray(selection?.imageFiles) ? selection.imageFiles.length : 0; + const warningCount = Array.isArray(selection?.warnings) ? selection.warnings.length : 0; + const idsPreview = nodeIds.length > 0 ? nodeIds.join(", ") : "(none)"; + return `Selection debug: ids=${idsPreview} | text=${textCount} | files=${fileCount} | images=${imageCount} | warnings=${warningCount}`; + } + + getNewThreadPromptFromSelection(selection, options = {}) { + const textBlocks = Array.isArray(selection?.textBlocks) ? selection.textBlocks : []; + const markdownFiles = Array.isArray(selection?.markdownFiles) ? selection.markdownFiles : []; + const imageFiles = Array.isArray(selection?.imageFiles) ? selection.imageFiles : []; + if (textBlocks.length === 0 && markdownFiles.length > 0 && imageFiles.length === 0) { + return buildCanvasSelectionPrompt( + selection, + markdownFiles.length === 1 + ? "Use the selected markdown file as the primary context and continue with the most helpful next step." + : "Use the selected markdown files as the primary context and continue with the most helpful next step.", + options, + ); + } + + if (textBlocks.length === 0 && markdownFiles.length === 0 && imageFiles.length > 0) { + return ""; + } + + if (textBlocks.length === 0 && (markdownFiles.length > 0 || imageFiles.length > 0)) { + return markdownFiles.length > 0 ? buildCanvasSelectionPrompt(selection, "", options) : ""; + } + + if (textBlocks.length !== 1) { + throw new Error("New thread currently requires selecting exactly one text node, optionally with file context, or selecting only supported file nodes."); + } + + const text = String(textBlocks[0]?.text || ""); + if (!text.trim()) { + throw new Error("The selected text node is empty."); + } + + if (markdownFiles.length > 0) { + return buildCanvasSelectionPrompt(selection, text, options); + } + + return text; + } + + truncateInline(value, maxLength) { + const singleLine = String(value || "").replace(/\s+/g, " ").trim(); + if (!singleLine) { + return ""; + } + + if (singleLine.length <= maxLength) { + return singleLine; + } + + return `${singleLine.slice(0, Math.max(0, maxLength - 1)).trimEnd()}...`; + } +}; diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..0805ee2 --- /dev/null +++ b/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "openagent", + "name": "OpenAgent", + "version": "0.1.2", + "minAppVersion": "1.5.0", + "description": "Run OpenAgent tasks from Obsidian Canvas through a local Codex server and Codex Desktop.", + "author": "OpenAgentMarket", + "authorUrl": "https://github.com/openagentmarket/openagent-obsidian-plugin", + "isDesktopOnly": true +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..94ea377 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "openagent-obsidian-plugin", + "version": "0.1.2", + "description": "Run OpenAgent tasks from Obsidian Canvas through a local Codex server and Codex Desktop.", + "license": "MIT", + "type": "commonjs", + "main": "main.js", + "files": [ + "main.js", + "manifest.json", + "styles.css" + ], + "scripts": { + "check": "node --check main.js", + "package": "node scripts/package-release.mjs" + } +} diff --git a/scripts/package-release.mjs b/scripts/package-release.mjs new file mode 100644 index 0000000..4be1011 --- /dev/null +++ b/scripts/package-release.mjs @@ -0,0 +1,67 @@ +import { createHash } from "node:crypto"; +import { execFileSync } from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; +import process from "node:process"; + +const root = process.cwd(); +const dist = path.join(root, "dist"); +const manifest = JSON.parse(fs.readFileSync(path.join(root, "manifest.json"), "utf8")); +const requiredFiles = ["main.js", "manifest.json", "styles.css"]; +const optionalFiles = ["logo.png", "vault-pet-mascot.png"]; +const archiveName = `openagent-obsidian-plugin-${manifest.version}.zip`; +const bundleDir = path.join(dist, manifest.id); + +fs.rmSync(dist, { recursive: true, force: true }); +fs.mkdirSync(bundleDir, { recursive: true }); + +for (const file of [...requiredFiles, ...optionalFiles]) { + const source = path.join(root, file); + if (!fs.existsSync(source)) { + if (requiredFiles.includes(file)) { + throw new Error(`Missing required release file: ${file}`); + } + continue; + } + + fs.copyFileSync(source, path.join(dist, file)); + fs.copyFileSync(source, path.join(bundleDir, file)); +} + +execFileSync("zip", ["-qr", archiveName, manifest.id], { cwd: dist }); + +const files = [...fs.readdirSync(dist).filter((file) => file !== manifest.id)].sort(); +const checksums = files + .map((file) => `${sha256(path.join(dist, file))} ${file}`) + .join("\n"); + +fs.writeFileSync(path.join(dist, "SHA256SUMS.txt"), `${checksums}\n`, "utf8"); +fs.writeFileSync(path.join(dist, "release-notes.md"), releaseNotes(manifest, archiveName), "utf8"); + +console.log(`Prepared release ${manifest.version}`); +for (const file of [...files, "SHA256SUMS.txt", "release-notes.md"]) { + console.log(`dist/${file}`); +} + +function sha256(filePath) { + const hash = createHash("sha256"); + hash.update(fs.readFileSync(filePath)); + return hash.digest("hex"); +} + +function releaseNotes(manifest, archiveName) { + return [ + `## ${manifest.name} ${manifest.version}`, + "", + "Community plugin release assets:", + "- `main.js`", + "- `manifest.json`", + "- `styles.css`", + "", + "Manual install bundle:", + `- \`${archiveName}\``, + "", + "Checksums are attached in `SHA256SUMS.txt`.", + "", + ].join("\n"); +} diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..0332099 --- /dev/null +++ b/styles.css @@ -0,0 +1,1844 @@ +.openagent-view { + --oa-space-1: 4px; + --oa-space-2: 8px; + --oa-space-3: 12px; + --oa-space-4: 16px; + --oa-space-5: 20px; + --oa-radius-sm: 8px; + --oa-radius-md: 12px; + --oa-radius-lg: 16px; + --oa-border: color-mix(in srgb, var(--background-modifier-border) 78%, transparent); + --oa-border-soft: color-mix(in srgb, var(--background-modifier-border) 52%, transparent); + --oa-surface: color-mix(in srgb, var(--background-secondary) 84%, transparent); + --oa-surface-strong: color-mix(in srgb, var(--background-secondary) 94%, var(--background-primary)); + --oa-surface-hover: color-mix(in srgb, var(--background-modifier-hover) 76%, transparent); + --oa-accent-soft: color-mix(in srgb, var(--interactive-accent) 12%, transparent); + --oa-panel-gutter: 0px; + height: 100%; + padding: 0; + display: flex; + flex-direction: column; + overflow: hidden; + background: var(--background-primary); +} + +.openagent-view .oa-panel-scroll, +.openagent-view .oa-panel-scroll *, +.openagent-view button, +.openagent-view .clickable-icon { + -webkit-user-select: none; + user-select: none; +} + +.openagent-view input, +.openagent-view textarea { + -webkit-user-select: text; + user-select: text; +} + +.oa-voice-graph-view { + height: 100%; + min-height: 0; + display: flex; + flex-direction: column; + overflow: hidden; + background: var(--background-primary); +} + +.oa-voice-graph-toolbar { + flex: 0 0 auto; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 12px; + padding: 8px 12px; + border-bottom: 1px solid color-mix(in srgb, var(--background-modifier-border) 62%, transparent); + background: color-mix(in srgb, var(--background-primary) 96%, transparent); + backdrop-filter: blur(12px); +} + +.oa-voice-graph-title { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.oa-voice-graph-title span { + color: var(--text-normal); + font-size: 0.9rem; + font-weight: 600; + line-height: 1.2; +} + +.oa-voice-graph-title small { + color: var(--text-muted); + font-size: 0.76rem; + line-height: 1.25; +} + +.oa-voice-graph-controls { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 6px; + min-width: 0; +} + +.oa-voice-graph-icon-button { + width: 28px; + height: 28px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 8px; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 62%, transparent); + background: transparent; + color: var(--text-muted); +} + +.oa-voice-graph-icon-button:hover { + color: var(--text-normal); + background: var(--background-modifier-hover); +} + +.oa-voice-graph-slider { + display: grid; + grid-template-columns: auto 112px; + align-items: center; + gap: 8px; + margin-left: 4px; + color: var(--text-muted); + font-size: 0.75rem; + white-space: nowrap; +} + +.oa-voice-graph-slider input { + width: 112px; +} + +.oa-voice-graph-stage { + position: relative; + flex: 1 1 auto; + min-height: 0; + overflow: hidden; +} + +.oa-voice-graph-canvas { + width: 100%; + height: 100%; + display: block; + touch-action: none; + cursor: grab; +} + +.oa-voice-graph-hud { + position: absolute; + left: 12px; + bottom: 12px; + display: flex; + flex-wrap: wrap; + gap: 6px; + max-width: calc(100% - 24px); + pointer-events: none; +} + +.oa-voice-graph-dictation { + position: absolute; + right: 12px; + bottom: 12px; + width: min(360px, calc(100% - 24px)); + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 6px; + align-items: end; +} + +.oa-voice-graph-dictation textarea { + width: 100%; + min-height: 48px; + max-height: 120px; + resize: vertical; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 52%, transparent); + border-radius: 8px; + padding: 7px 8px; + background: color-mix(in srgb, var(--background-primary) 88%, transparent); + color: var(--text-normal); + font-size: 0.78rem; + line-height: 1.35; + backdrop-filter: blur(10px); +} + +.oa-voice-graph-dictation textarea:focus { + outline: none; + border-color: color-mix(in srgb, var(--text-muted) 58%, var(--background-modifier-border)); +} + +.oa-voice-graph-dictation button { + height: 30px; + min-height: 30px; + padding: 0 10px; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 55%, transparent); + border-radius: 8px; + background: color-mix(in srgb, var(--background-secondary) 84%, transparent); + color: var(--text-normal); + font-size: 0.76rem; +} + +.oa-voice-graph-dictation button:disabled { + opacity: 0.45; +} + +.oa-voice-graph-hud span { + padding: 4px 7px; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 46%, transparent); + border-radius: 8px; + background: color-mix(in srgb, var(--background-primary) 82%, transparent); + color: var(--text-muted); + font-size: 0.7rem; + line-height: 1.2; + backdrop-filter: blur(10px); +} + +@media (max-width: 680px) { + .oa-voice-graph-toolbar { + grid-template-columns: 1fr; + } + + .oa-voice-graph-controls { + justify-content: flex-start; + flex-wrap: wrap; + } + + .oa-voice-graph-slider { + width: 100%; + grid-template-columns: auto minmax(96px, 1fr); + } + + .oa-voice-graph-slider input { + width: 100%; + } + + .oa-voice-graph-dictation { + left: 12px; + right: 12px; + bottom: 42px; + width: auto; + } +} + +.openagent-view .oa-message-text, +.openagent-view .oa-message-text * { + -webkit-user-select: text; + user-select: text; +} + +.oa-panel-scroll { + flex: 1 1 auto; + min-height: 0; + padding: 0; + overflow-y: auto; +} + +.oa-panel-scroll > * + * { + margin-top: var(--oa-space-3); +} + +.oa-header-top { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 6px; +} + +.oa-brand { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; +} + +.oa-brand-text { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.oa-brand-title-row { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; +} + +.oa-brand-text h2 { + margin: 0; + font-size: 1rem; + font-weight: 600; + line-height: 1.2; +} + +.oa-daemon-online-dot { + width: 8px; + height: 8px; + border-radius: 999px; + background: var(--color-green); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-green) 16%, transparent); + flex: 0 0 auto; +} + +.oa-brand-subtitle { + color: var(--text-muted); + font-size: 0.8rem; + line-height: 1.35; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.oa-logo { + width: 32px; + height: 32px; + border-radius: 8px; + display: inline-flex; + align-items: center; + justify-content: center; + background: var(--oa-surface); + border: 1px solid var(--oa-border-soft); + flex: 0 0 auto; +} + +.oa-logo-mark { + color: var(--text-muted); + font-size: 0.92rem; + font-weight: 700; + letter-spacing: 0; +} + +.oa-logo-image { + width: 24px; + height: 24px; + object-fit: contain; + display: block; +} + +.oa-header, +.oa-task-section { + margin: 0; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; +} + +.oa-header { + position: sticky; + top: 0; + z-index: 5; + margin: 0 calc(var(--oa-panel-gutter) * -1); + padding: 10px var(--oa-panel-gutter) 8px; + border-bottom: 1px solid var(--oa-border-soft); + background: color-mix(in srgb, var(--background-primary) 92%, transparent); + backdrop-filter: blur(18px); +} + +.oa-detail-section, +.oa-settings-body { + display: flex; + flex-direction: column; + gap: var(--oa-space-3); +} + +.oa-detail-section { + padding: 10px 0 8px; +} + +.oa-messages-section { + margin-top: 16px; + padding-top: 14px; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-detail-section.is-empty-state { + display: flex; + flex-direction: column; + gap: 10px; + padding-top: 0; + padding-bottom: 0; +} + +.oa-detail-section.is-empty-state .oa-action-row { + margin-top: 0; +} + +.oa-message-pagination { + display: flex; + flex-direction: column; + gap: 6px; + margin-bottom: 10px; +} + +.oa-message-pagination-summary { + color: var(--text-muted); + font-size: 0.78rem; + line-height: 1.4; +} + +.oa-message-pagination-actions { + margin-top: 0; +} + +.oa-composer-section { + flex: 0 0 auto; + margin: 0; + padding: 12px 0 6px; + border-top: 1px solid var(--oa-border); + background: color-mix(in srgb, var(--background-primary) 90%, transparent); + backdrop-filter: blur(18px); + box-shadow: none; +} + +.oa-action-row.oa-header-actions { + display: flex; + justify-content: flex-end; + gap: 4px; + margin-top: 0; + width: auto; +} + +.oa-action-row.oa-header-actions button { + padding: 5px 10px; + border-radius: 999px; + background: color-mix(in srgb, var(--background-secondary) 74%, transparent); + font-size: 0.78rem; + line-height: 1.2; + white-space: nowrap; +} + +.oa-action-row { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 8px; +} + +.oa-action-row button { + border-radius: var(--oa-radius-sm); + padding: 7px 11px; + min-width: 0; + min-height: auto; + background: var(--oa-surface); + border: 1px solid var(--oa-border-soft); + box-shadow: none; + color: var(--text-normal); + overflow: hidden; + text-overflow: ellipsis; +} + +.oa-action-row button:hover:not(:disabled) { + background: var(--oa-surface-hover); + color: var(--text-normal); +} + +.oa-action-row button:disabled { + opacity: 0.45; +} + +.oa-settings-body { + min-width: 0; +} + +.oa-settings-page-content { + display: flex; + flex-direction: column; + gap: 12px; +} + +.oa-panel-tabs { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 6px; +} + +.oa-panel-tab { + appearance: none; + min-width: 0; + padding: 6px 8px; + border: 1px solid var(--oa-border-soft); + border-radius: var(--oa-radius-sm); + background: transparent; + color: var(--text-muted); + cursor: pointer; + font: inherit; + font-size: 0.78rem; + line-height: 1.2; + text-align: center; + box-shadow: none; +} + +.oa-panel-tab:hover { + color: var(--text-normal); + border-color: var(--oa-border); +} + +.oa-panel-tab.is-active { + color: var(--text-normal); + border-color: color-mix(in srgb, var(--interactive-accent) 30%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--interactive-accent) 8%, transparent); +} + +.openagent-view .oa-panel-tab, +.openagent-view .oa-panel-tab:hover, +.openagent-view .oa-panel-tab:focus, +.openagent-view .oa-panel-tab:focus-visible, +.openagent-view .oa-panel-tab:active, +.openagent-view .oa-settings-inline-tab, +.openagent-view .oa-settings-inline-tab:hover, +.openagent-view .oa-settings-inline-tab:focus, +.openagent-view .oa-settings-inline-tab:focus-visible, +.openagent-view .oa-settings-inline-tab:active { + box-shadow: none !important; +} + +.oa-task-list, +.oa-message-list, +.oa-workspace-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.oa-task-list-date-heading { + margin: 14px 0 2px; + color: var(--text-muted); + font-size: 0.72rem; + font-weight: 600; + line-height: 1.45; + letter-spacing: 0.01em; + text-transform: none; +} + +.oa-task-list-date-heading:first-child { + margin-top: 2px; +} + +.oa-task-item, +.oa-message, +.oa-workspace-item { + border: 1px solid var(--oa-border-soft); + border-radius: var(--oa-radius-md); + padding: 11px 12px; + background: var(--oa-surface-strong); + min-width: 0; +} + +.oa-group-context-card { + gap: 8px; +} + +.oa-group-context-list { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 8px; +} + +.oa-group-context-item { + border: 1px solid var(--oa-border-soft); + border-radius: var(--oa-radius-sm); + padding: 8px 10px; + background: color-mix(in srgb, var(--background-primary) 58%, transparent); +} + +.oa-group-context-label { + color: var(--text-muted); + font-size: 0.74rem; + line-height: 1.35; + margin-bottom: 2px; +} + +.oa-group-context-value { + color: var(--text-normal); + font-size: 0.82rem; + line-height: 1.45; + overflow-wrap: anywhere; +} + +.oa-task-item { + cursor: pointer; + transition: + border-color 120ms ease, + background-color 120ms ease; +} + +.oa-task-item:hover { + border-color: color-mix(in srgb, var(--background-modifier-border-hover) 70%, transparent); + background: var(--oa-surface-hover); +} + +.oa-task-item.is-active { + border-color: color-mix(in srgb, var(--interactive-accent) 30%, var(--oa-border-soft)); + background: var(--oa-accent-soft); +} + +.oa-thread-list-item { + padding: 10px 12px; + background: color-mix(in srgb, var(--background-primary) 76%, var(--background-secondary)); +} + +.oa-thread-list-item:hover { + border-color: color-mix(in srgb, var(--background-modifier-border-hover) 72%, transparent); + background: color-mix(in srgb, var(--background-modifier-hover) 72%, var(--background-primary)); +} + +.oa-thread-list-item.is-active { + border-color: color-mix(in srgb, var(--interactive-accent) 30%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--interactive-accent) 10%, var(--background-primary)); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--interactive-accent) 12%, transparent); +} + +.oa-thread-list-item.is-running, +.oa-thread-list-item.is-running:hover, +.oa-thread-list-item.is-running.is-active { + border-color: color-mix(in srgb, var(--color-yellow) 56%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--color-yellow) 13%, var(--background-primary)); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-yellow) 18%, transparent); +} + +.oa-thread-list-main { + min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; +} + +.oa-thread-list-title { + font-size: 0.84rem; + font-weight: 600; + line-height: 1.35; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.oa-thread-list-meta { + color: var(--text-faint); + font-size: 0.72rem; + line-height: 1.35; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.oa-thread-list-arrow { + appearance: none; + flex: 0 0 auto; + color: var(--text-faint); + width: 20px; + height: 20px; + border: 1px solid var(--oa-border-soft); + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: color-mix(in srgb, var(--background-secondary) 72%, transparent); + cursor: pointer; + padding: 0; + box-shadow: none; + font: inherit; + font-size: 0.8rem; + line-height: 1; +} + +.oa-thread-list-arrow:hover { + color: var(--text-normal); + border-color: var(--oa-border); +} + +.openagent-view .oa-thread-list-arrow, +.openagent-view .oa-thread-list-arrow:hover, +.openagent-view .oa-thread-list-arrow:focus, +.openagent-view .oa-thread-list-arrow:focus-visible, +.openagent-view .oa-thread-list-arrow:active { + box-shadow: none !important; +} + +.oa-thread-list-unread-dot { + flex: 0 0 auto; + width: 10px; + height: 10px; + margin-top: 4px; + border-radius: 999px; + background: #8b5cf6; + box-shadow: 0 0 0 4px color-mix(in srgb, #8b5cf6 16%, transparent); +} + +.oa-task-title, +.oa-detail-title { + font-weight: 600; +} + +.oa-conversation-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 8px; + margin-top: 12px; + padding-top: 10px; + border-top: 1px solid var(--oa-border-soft); + min-width: 0; +} + +.oa-task-item-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 8px; + min-width: 0; +} + +.oa-detail-title { + font-size: 0.98rem; + line-height: 1.35; + overflow-wrap: anywhere; + min-width: 0; +} + +.oa-status-tag { + flex: 0 0 auto; + max-width: 38%; + padding: 3px 8px; + border: 1px solid var(--oa-border-soft); + border-radius: var(--oa-radius-sm); + background: var(--oa-surface); + color: var(--text-muted); + font-size: 0.72rem; + line-height: 1.35; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.oa-status-tag.is-running { + border-color: color-mix(in srgb, var(--color-yellow) 42%, transparent); + background: color-mix(in srgb, var(--color-yellow) 14%, transparent); + color: var(--text-normal); +} + +.oa-status-tag.is-online { + border-color: color-mix(in srgb, var(--color-green) 42%, transparent); + background: color-mix(in srgb, var(--color-green) 14%, transparent); + color: var(--text-normal); +} + +.oa-status-tag.is-offline { + border-color: color-mix(in srgb, var(--color-red) 42%, transparent); + background: color-mix(in srgb, var(--color-red) 12%, transparent); + color: var(--text-normal); +} + +.oa-status-tag.is-checking { + border-color: color-mix(in srgb, var(--interactive-accent) 36%, transparent); + background: color-mix(in srgb, var(--interactive-accent) 10%, transparent); + color: var(--text-normal); +} + +.oa-task-meta, +.oa-message-label, +.oa-muted { + color: var(--text-muted); + font-size: 0.8rem; + line-height: 1.45; + overflow-wrap: anywhere; +} + +.oa-task-section > h3, +.oa-detail-section > h3, +.oa-settings-section > h3, +.oa-messages-section > h4 { + margin: 0 0 8px; + color: var(--text-muted); + font-size: 0.78rem; + font-weight: 500; + letter-spacing: 0; + text-transform: none; +} + +.oa-role-user { + border-color: color-mix(in srgb, var(--interactive-accent) 28%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--interactive-accent) 8%, var(--background-primary)); +} + +.oa-role-assistant { + background: var(--oa-surface-strong); +} + +.oa-role-system { + background: color-mix(in srgb, var(--background-secondary) 68%, transparent); +} + +.oa-message-text { + white-space: pre-wrap; + word-break: break-word; + line-height: 1.5; +} + +.oa-message-text.is-hidden { + display: none; +} + +.oa-message-label + .oa-message-text, +.oa-task-title + .oa-task-meta { + margin-top: 4px; +} + +.oa-message-tool { + border: 0; + padding: 8px 10px; + background: transparent; + box-shadow: none; +} + +.oa-chat-message { + border: 0; + border-radius: 0; + padding: 0; + background: transparent; + box-shadow: none; +} + +.oa-chat-message.oa-role-user, +.oa-chat-message.oa-role-assistant, +.oa-chat-message.oa-role-system { + border: 0; + background: transparent; + box-shadow: none; +} + +.oa-chat-message.oa-role-user { + align-self: flex-end; + width: fit-content; + max-width: min(78%, 42rem); + padding: 10px 12px 10px 14px; + border: 1px solid color-mix(in srgb, var(--interactive-accent) 18%, var(--oa-border-soft)); + border-radius: var(--oa-radius-md); + background: color-mix(in srgb, var(--interactive-accent) 7%, var(--background-primary)); +} + +.oa-selection-message { + width: min(78%, 42rem); +} + +.oa-selection-image-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 10px; + margin-top: 6px; +} + +.oa-selection-image-card { + display: flex; + flex-direction: column; + gap: 6px; +} + +.oa-selection-image { + display: block; + width: 100%; + max-height: 220px; + object-fit: contain; + border-radius: 12px; + border: 1px solid color-mix(in srgb, var(--interactive-accent) 12%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--background-secondary) 72%, transparent); +} + +.oa-selection-image-fallback { + display: flex; + align-items: center; + justify-content: center; + min-height: 120px; + border-radius: 12px; + border: 1px dashed var(--oa-border-soft); + color: var(--text-muted); + font-size: 0.76rem; + text-align: center; + padding: 12px; +} + +.oa-selection-image-caption { + color: var(--text-muted); + font-size: 0.72rem; + line-height: 1.4; + overflow-wrap: anywhere; +} + +.oa-chat-message.oa-message-tool, +.oa-chat-message.oa-message-tool.oa-role-user, +.oa-chat-message.oa-message-tool.oa-role-assistant, +.oa-chat-message.oa-message-tool.oa-role-system { + border: 0; + background: transparent; + box-shadow: none; +} + +.oa-message-toggle { + appearance: none; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 10px; + width: 100%; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; + color: inherit; + text-align: left; + cursor: pointer; + min-height: 0; +} + +.oa-chat-message.oa-message-tool .oa-message-toggle, +.oa-chat-message.oa-message-tool .oa-message-toggle:hover, +.oa-chat-message.oa-message-tool .oa-message-toggle:focus, +.oa-chat-message.oa-message-tool .oa-message-toggle:focus-visible, +.oa-chat-message.oa-message-tool .oa-message-toggle:active { + border: 0 !important; + outline: 0; + background: transparent !important; + box-shadow: none !important; +} + +.oa-message-toggle:hover .oa-message-preview { + color: var(--text-normal); +} + +.oa-message-toggle-text { + min-width: 0; +} + +.oa-message-preview { + margin-top: 2px; + color: var(--text-muted); + font-size: 0.8rem; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.oa-message-toggle-icon { + width: 20px; + height: 20px; + border: 0; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: transparent; + box-shadow: none; + color: var(--text-muted); + font-size: 0.85rem; + line-height: 1; + flex: 0 0 auto; +} + +.oa-message-tool.is-expanded .oa-message-text { + margin-top: 8px; + padding-top: 8px; + border-top: 0; +} + +.oa-banner { + border-radius: 8px; + padding: 9px 11px; + margin: 0; + border: 1px solid var(--oa-border-soft); + line-height: 1.45; + overflow-wrap: anywhere; +} + +.oa-banner-error { + background: color-mix(in srgb, var(--color-red) 9%, transparent); + border-color: color-mix(in srgb, var(--color-red) 24%, transparent); +} + +.oa-banner-warning { + background: color-mix(in srgb, var(--color-orange) 9%, transparent); + border-color: color-mix(in srgb, var(--color-orange) 24%, transparent); +} + +.oa-workspace-section { + margin-top: 16px; +} + +.oa-workspace-modal h2 { + margin-bottom: 4px; +} + +.oa-workspace-modal-subtitle { + color: var(--text-muted); + font-size: 0.88rem; + line-height: 1.45; + margin-bottom: 18px; + max-width: 560px; +} + +.oa-workspace-modal .oa-workspace-section > h3, +.oa-workspace-create-panel > h3 { + margin: 0 0 10px; + color: var(--text-muted); + font-size: 0.82rem; + font-weight: 600; + letter-spacing: 0; +} + +.oa-workspace-modal .oa-workspace-list { + gap: 8px; +} + +.oa-workspace-modal .oa-workspace-item { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 12px; + align-items: center; + padding: 12px; + background: color-mix(in srgb, var(--background-primary) 62%, var(--background-secondary)); +} + +.oa-workspace-item-main { + min-width: 0; +} + +.oa-workspace-open-button { + min-width: 70px; +} + +.oa-workspace-create-panel { + padding-top: 16px; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-settings-section, +.oa-settings-card { + margin: 0; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +.oa-workspace-settings-section { + background: transparent; +} + +.oa-settings-section-block { + display: flex; + flex-direction: column; + gap: 10px; +} + +.oa-settings-section-block + .oa-settings-section-block { + padding-top: 14px; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-settings-section-header { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 10px; + min-width: 0; +} + +.oa-settings-section-title { + margin: 0; + color: var(--text-normal); + font-size: 0.9rem; + font-weight: 650; + line-height: 1.25; +} + +.oa-settings-inline-tabs { + display: flex; + align-items: center; + gap: 6px; + flex: 0 0 auto; + flex-wrap: wrap; + width: 100%; +} + +.oa-settings-inline-tab { + appearance: none; + padding: 5px 9px; + border: 1px solid var(--oa-border-soft); + border-radius: 999px; + background: color-mix(in srgb, var(--background-primary) 82%, transparent); + color: var(--text-muted); + cursor: pointer; + font: inherit; + font-size: 0.78rem; + line-height: 1.2; + box-shadow: none; + flex: 1 1 78px; + text-align: center; +} + +.oa-settings-inline-tab:hover { + color: var(--text-normal); + border-color: var(--oa-border); +} + +.oa-settings-inline-tab.is-active { + color: var(--text-normal); + border-color: color-mix(in srgb, var(--interactive-accent) 28%, var(--oa-border-soft)); +} + +.oa-thread-filter-shell { + width: auto; + flex: 0 0 auto; +} + +.oa-thread-filter-select { + appearance: none; + width: 18px; + min-height: 0; + padding: 0; + border: 0; + border-radius: 0; + background: + linear-gradient(45deg, transparent 50%, var(--text-muted) 50%) 4px 55% / 5px 5px no-repeat, + linear-gradient(135deg, var(--text-muted) 50%, transparent 50%) 9px 55% / 5px 5px no-repeat; + color: transparent; + cursor: pointer; + font: inherit; + font-size: 0.84rem; + font-weight: 500; + line-height: 1.25; + box-shadow: none; +} + +.oa-thread-filter-select:hover, +.oa-thread-filter-select:focus, +.oa-thread-filter-select:focus-visible { + color: transparent; + box-shadow: none; + outline: none; +} + +.oa-thread-filter-select option { + color: var(--text-normal); +} + +.oa-thread-filter-header { + flex-direction: row; + align-items: center; + justify-content: flex-start; + gap: 10px; +} + +.oa-thread-filter-header .oa-settings-section-title { + flex: 0 0 auto; + min-width: 0; +} + +.oa-workspace-overview { + padding: 12px; + border: 1px solid var(--oa-border-soft); + border-radius: 14px; + background: transparent; + box-shadow: none; +} + +.oa-workspace-overview.is-ready { + border-color: color-mix(in srgb, var(--interactive-accent) 24%, var(--oa-border-soft)); +} + +.oa-workspace-overview.is-empty { + border-color: color-mix(in srgb, var(--color-orange) 28%, var(--oa-border-soft)); +} + +.oa-workspace-overview-top { + display: flex; + flex-direction: column; + gap: 6px; + min-width: 0; +} + +.oa-workspace-status { + align-self: flex-start; + padding: 2px 7px; + border: 1px solid var(--oa-border-soft); + border-radius: var(--oa-radius-sm); + color: var(--text-muted); + font-size: 0.72rem; + font-weight: 600; + line-height: 1.35; +} + +.oa-workspace-overview.is-ready .oa-workspace-status { + border-color: color-mix(in srgb, var(--interactive-accent) 26%, transparent); + background: transparent; + color: var(--text-normal); +} + +.oa-workspace-overview.is-empty .oa-workspace-status { + border-color: color-mix(in srgb, var(--color-orange) 28%, transparent); + background: transparent; + color: var(--text-normal); +} + +.oa-workspace-name { + color: var(--text-normal); + font-size: 1.02rem; + font-weight: 650; + line-height: 1.3; + overflow-wrap: anywhere; +} + +.oa-workspace-detail-grid { + display: grid; + gap: 8px; + margin-top: 12px; +} + +.oa-workspace-detail { + min-width: 0; + padding-top: 8px; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-workspace-detail-label { + color: var(--text-faint); + font-size: 0.72rem; + line-height: 1.35; +} + +.oa-workspace-detail-value { + margin-top: 2px; + color: var(--text-normal); + font-size: 0.82rem; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.oa-settings-list { + display: flex; + flex-direction: column; + gap: 0; +} + +.oa-settings-subsection { + margin-top: 14px; + padding-top: 14px; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-settings-note { + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-settings-row { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 4px; + min-width: 0; + align-items: start; + padding: 10px 0; + border-top: 1px solid var(--oa-border-soft); +} + +.oa-settings-row:first-child { + padding-top: 0; + border-top: 0; +} + +.oa-settings-label { + color: var(--text-faint); + font-size: 0.74rem; + font-weight: 600; + line-height: 1.35; +} + +.oa-settings-value { + min-width: 0; + color: var(--text-normal); + font-size: 0.82rem; + line-height: 1.35; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.oa-settings-value-stack { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 6px; + overflow: visible; + text-overflow: clip; + white-space: normal; +} + +.oa-settings-value-path { + overflow: visible; + text-overflow: clip; + white-space: normal; + overflow-wrap: anywhere; + word-break: break-word; +} + +.oa-settings-actions { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 8px; +} + +.oa-settings-actions button { + width: 100%; + justify-content: center; +} + +.oa-settings-task-section { + padding-top: 2px; +} + +.oa-header-actions .oa-icon-button.is-icon-only { + width: 32px; + height: 32px; + min-width: 32px; + padding: 0; + align-items: center; + justify-content: center; +} + +.oa-header-actions .oa-icon-button.is-icon-only svg { + width: 16px; + height: 16px; +} + +.oa-composer-input-shell { + position: relative; + border: 1px solid var(--oa-border-soft); + border-radius: var(--oa-radius-md); + background: var(--oa-surface-strong); +} + +.oa-composer-input-shell:focus-within { + border-color: color-mix(in srgb, var(--interactive-accent) 36%, var(--oa-border-soft)); + background: var(--oa-surface-strong); +} + +.oa-composer-input { + display: block; + width: 100%; + min-height: 64px; + resize: vertical; + border: 0; + border-radius: 8px; + padding: 10px 72px 10px 12px; + background: transparent; + color: var(--text-normal); + box-sizing: border-box; + line-height: 1.45; +} + +.oa-composer-input::placeholder { + color: var(--text-faint); +} + +.oa-composer-input:focus { + outline: none; + box-shadow: none; +} + +.oa-composer-action-button { + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + display: inline-flex; + align-items: center; + justify-content: center; + height: 30px; + min-height: 30px; + padding: 0; + border: 1px solid var(--oa-border-soft); + border-radius: 8px; + box-shadow: none; + line-height: 1; +} + +.oa-composer-action-button.is-send { + width: 30px; + min-width: 30px; + background: var(--interactive-accent); + color: var(--text-on-accent); +} + +.oa-composer-action-button.is-stop { + min-width: 52px; + padding: 0 10px; + border-color: color-mix(in srgb, var(--color-red) 42%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--color-red) 15%, var(--oa-surface-strong)); + color: color-mix(in srgb, var(--color-red) 82%, var(--text-normal)); + font-size: 0.78rem; + font-weight: 600; +} + +.oa-composer-action-button:hover:not(:disabled) { + color: var(--text-on-accent); +} + +.oa-composer-action-button.is-send:hover:not(:disabled) { + background: var(--interactive-accent-hover); + color: var(--text-on-accent); +} + +.oa-composer-action-button.is-stop:hover:not(:disabled) { + border-color: color-mix(in srgb, var(--color-red) 54%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--color-red) 22%, var(--oa-surface-strong)); + color: color-mix(in srgb, var(--color-red) 88%, var(--text-normal)); +} + +.oa-composer-action-button:disabled { + opacity: 0.45; +} + +.oa-hotkey-capture-input { + cursor: pointer; +} + +.openagent-view .oa-settings-section .setting-item { + margin-top: 0; + padding: 16px 0; + border-top: 1px solid var(--oa-border-soft); + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 10px; +} + +.openagent-view .oa-settings-section .setting-item:first-of-type { + padding-top: 0; + border-top: 0; +} + +.openagent-view .oa-settings-section .setting-item-info { + padding-right: 0; + width: 100%; +} + +.openagent-view .oa-settings-section .setting-item-control { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 8px; + margin-top: 0; + width: 100%; +} + +.openagent-view .oa-settings-section .setting-item-control input, +.openagent-view .oa-settings-section .setting-item-control select { + width: 100%; + min-width: 0; + border-radius: 11px; + background: transparent; + border: 1px solid var(--oa-border-soft); + box-shadow: none; +} + +.openagent-view .oa-settings-section .setting-item-control button { + white-space: nowrap; + border-radius: 11px; + background: transparent; + box-shadow: none; +} + +.openagent-view .oa-settings-section .setting-item-name { + font-size: 0.9rem; + font-weight: 600; +} + +.openagent-view .oa-settings-section .setting-item-description { + color: var(--text-muted); + font-size: 0.82em; + line-height: 1.45; +} + +.oa-settings-body .oa-action-row button { + background: transparent; + box-shadow: none; +} + +.oa-settings-body .oa-action-row button:hover:not(:disabled) { + background: transparent; +} + +.oa-panel-scroll.is-settings-screen button, +.oa-panel-scroll.is-settings-screen button:hover:not(:disabled), +.oa-panel-scroll.is-settings-screen button:focus, +.oa-panel-scroll.is-settings-screen button:focus-visible, +.oa-panel-scroll.is-settings-screen button:active { + box-shadow: none !important; +} + +.oa-settings-task-section .oa-task-item, +.oa-settings-task-section .oa-workspace-item { + background: color-mix(in srgb, var(--background-primary) 82%, transparent); + box-shadow: none; +} + +.oa-settings-task-section .oa-thread-list-item.is-running, +.oa-settings-task-section .oa-thread-list-item.is-running:hover, +.oa-settings-task-section .oa-thread-list-item.is-running.is-active { + border-color: color-mix(in srgb, var(--color-yellow) 56%, var(--oa-border-soft)); + background: color-mix(in srgb, var(--color-yellow) 13%, var(--background-primary)); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-yellow) 18%, transparent); +} + +.oa-fork-modal { + display: grid; + gap: 12px; +} + +.oa-fork-modal h2 { + margin: 0; +} + +.oa-fork-modal-subtitle, +.oa-fork-modal-details { + color: var(--text-muted); + font-size: 0.9rem; + line-height: 1.45; +} + +.oa-fork-modal-details { + display: grid; + gap: 4px; +} + +.oa-fork-modal-actions { + justify-content: flex-end; + margin-top: 4px; +} + +.oa-vault-pet { + --oa-pet-shell: #ff7b72; + --oa-pet-shell-dark: #d94d66; + --oa-pet-glow: #7dd3fc; + --oa-pet-ink: #243142; + --oa-pet-cream: #fff7ed; + position: fixed; + z-index: 1000; + width: 118px; + height: 142px; + left: calc(100vw - 152px); + top: calc(100vh - 172px); + display: grid; + place-items: end center; + pointer-events: auto; + cursor: grab; + user-select: none; + filter: drop-shadow(0 16px 28px rgb(0 0 0 / 0.2)); + transition: left 520ms cubic-bezier(0.2, 0.9, 0.2, 1), top 520ms cubic-bezier(0.2, 0.9, 0.2, 1); +} + +.oa-vault-pet:focus-visible { + outline: 2px solid var(--interactive-accent); + outline-offset: 4px; + border-radius: 999px; +} + +.oa-vault-pet.is-dragging { + cursor: grabbing; + transition: none; +} + +.oa-vault-pet-creature { + position: relative; + width: 112px; + height: 112px; + animation: oa-pet-bob 3.8s ease-in-out infinite; + transform-origin: 50% 72%; +} + +.oa-vault-pet.is-excited .oa-vault-pet-creature, +.oa-vault-pet.is-petted .oa-vault-pet-creature { + animation: oa-pet-party 720ms cubic-bezier(0.2, 1.4, 0.3, 1); +} + +.oa-vault-pet.is-wandering .oa-vault-pet-creature { + animation: oa-pet-swim 840ms ease-in-out; +} + +.oa-vault-pet.is-summoned .oa-vault-pet-creature { + animation: oa-pet-summon 900ms cubic-bezier(0.16, 1.2, 0.28, 1); +} + +.oa-vault-pet-mascot { + position: absolute; + inset: 0; + width: 112px; + height: 112px; + object-fit: contain; + display: block; + pointer-events: none; + -webkit-user-drag: none; + user-select: none; +} + +.oa-vault-pet-shadow { + position: absolute; + left: 26px; + bottom: 0; + width: 66px; + height: 14px; + border-radius: 999px; + background: rgb(0 0 0 / 0.18); + filter: blur(3px); + animation: oa-pet-shadow 3.8s ease-in-out infinite; +} + +.oa-vault-pet-bubble { + position: absolute; + left: 50%; + bottom: 119px; + width: max-content; + min-width: 160px; + max-width: min(360px, calc(100vw - 36px)); + padding: 9px 12px; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 70%, transparent); + border-radius: 12px; + background: color-mix(in srgb, var(--background-primary) 94%, transparent); + color: var(--text-normal); + box-shadow: 0 12px 28px rgb(0 0 0 / 0.18); + font-size: 0.78rem; + line-height: 1.35; + text-align: center; + opacity: 0; + pointer-events: none; + transform: translate(-50%, 8px) scale(0.96); + transition: opacity 160ms ease, transform 160ms ease; + white-space: normal; + overflow-wrap: anywhere; + word-break: normal; +} + +.oa-vault-pet-bubble::after { + content: ""; + position: absolute; + left: 50%; + bottom: -7px; + width: 12px; + height: 12px; + border-right: 1px solid color-mix(in srgb, var(--background-modifier-border) 70%, transparent); + border-bottom: 1px solid color-mix(in srgb, var(--background-modifier-border) 70%, transparent); + background: color-mix(in srgb, var(--background-primary) 94%, transparent); + transform: translateX(-50%) rotate(45deg); +} + +.oa-vault-pet.has-message .oa-vault-pet-bubble, +.oa-vault-pet:hover .oa-vault-pet-bubble, +.oa-vault-pet:focus-visible .oa-vault-pet-bubble { + opacity: 1; + transform: translate(-50%, 0) scale(1); +} + +.oa-vault-pet-chat { + position: absolute; + right: 86px; + bottom: 30px; + width: min(360px, calc(100vw - 42px)); + display: grid; + gap: 7px; + padding: 10px; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 76%, transparent); + border-radius: 12px; + background: color-mix(in srgb, var(--background-primary) 96%, transparent); + box-shadow: 0 18px 38px rgb(0 0 0 / 0.24); + opacity: 0; + pointer-events: none; + transform: translateY(10px) scale(0.97); + transform-origin: 100% 100%; + transition: opacity 160ms ease, transform 160ms ease; +} + +.oa-vault-pet.is-chat-right .oa-vault-pet-chat { + left: 86px; + right: auto; + transform-origin: 0 100%; +} + +.oa-vault-pet.has-chat .oa-vault-pet-chat { + opacity: 1; + pointer-events: auto; + transform: translateY(0) scale(1); +} + +.oa-vault-pet.has-chat .oa-vault-pet-bubble { + opacity: 0; +} + +.oa-vault-pet-chat-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.oa-vault-pet-chat-title { + min-width: 0; + color: var(--text-normal); + font-size: 0.84rem; + font-weight: 700; + line-height: 1.2; +} + +.oa-vault-pet-chat-close { + width: 24px; + height: 24px; + min-width: 24px; + min-height: 24px; + padding: 0; + border-radius: 7px; + display: inline-flex; + align-items: center; + justify-content: center; + background: transparent; + color: var(--text-muted); + box-shadow: none; +} + +.oa-vault-pet-chat-path, +.oa-vault-pet-chat-cwd { + color: var(--text-muted); + font-size: 0.72rem; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.oa-vault-pet-chat-input { + width: 100%; + min-height: 118px; + max-height: 280px; + resize: vertical; + box-sizing: border-box; + padding: 9px 10px; + border: 1px solid color-mix(in srgb, var(--background-modifier-border) 78%, transparent); + border-radius: 10px; + background: color-mix(in srgb, var(--background-secondary) 60%, transparent); + color: var(--text-normal); + font-size: 0.8rem; + line-height: 1.42; + box-shadow: none; +} + +.oa-vault-pet-chat-input:focus { + outline: none; + border-color: color-mix(in srgb, var(--interactive-accent) 48%, var(--background-modifier-border)); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--interactive-accent) 16%, transparent); +} + +.oa-vault-pet-chat-actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.oa-vault-pet-chat-hint { + min-width: 0; + color: var(--text-faint); + font-size: 0.7rem; + line-height: 1.2; +} + +.oa-vault-pet-chat-send { + min-height: 28px; + padding: 0 11px; + border-radius: 8px; + background: var(--interactive-accent); + color: var(--text-on-accent); + box-shadow: none; + font-size: 0.78rem; + font-weight: 650; +} + +.oa-vault-pet-chat-send:hover:not(:disabled) { + background: var(--interactive-accent-hover); + color: var(--text-on-accent); +} + +.oa-vault-pet-chat-send:disabled, +.oa-vault-pet-chat-input:disabled { + opacity: 0.58; +} + +@keyframes oa-pet-bob { + 0%, 100% { transform: translateY(0) rotate(-1deg); } + 50% { transform: translateY(-9px) rotate(1.5deg); } +} + +@keyframes oa-pet-shadow { + 0%, 100% { transform: scaleX(1); opacity: 0.72; } + 50% { transform: scaleX(0.78); opacity: 0.42; } +} + +@keyframes oa-pet-party { + 0% { transform: translateY(0) rotate(0); } + 30% { transform: translateY(-18px) rotate(-8deg) scale(1.04); } + 60% { transform: translateY(-6px) rotate(7deg) scale(1.02); } + 100% { transform: translateY(0) rotate(0); } +} + +@keyframes oa-pet-swim { + 0%, 100% { transform: translateX(0) rotate(0); } + 35% { transform: translateX(-8px) rotate(-5deg); } + 70% { transform: translateX(6px) rotate(4deg); } +} + +@keyframes oa-pet-summon { + 0% { transform: translateY(8px) rotate(-8deg) scale(0.92); } + 45% { transform: translateY(-17px) rotate(7deg) scale(1.05); } + 72% { transform: translateY(-4px) rotate(-3deg) scale(1.02); } + 100% { transform: translateY(0) rotate(0) scale(1); } +} + +@media (prefers-reduced-motion: reduce) { + .oa-vault-pet, + .oa-vault-pet *, + .oa-vault-pet::before, + .oa-vault-pet::after { + animation: none !important; + transition: none !important; + } +} + +@media (min-width: 680px) { + .openagent-view .oa-settings-section .setting-item { + grid-template-columns: minmax(0, 1fr) minmax(180px, 220px); + align-items: center; + } + + .openagent-view .oa-settings-section .setting-item-control { + grid-template-columns: minmax(0, 1fr) auto; + justify-self: end; + width: min(100%, 220px); + } + + .oa-settings-actions { + grid-template-columns: repeat(2, minmax(0, max-content)); + } + + .oa-settings-actions button { + width: auto; + } +} diff --git a/vault-pet-mascot.png b/vault-pet-mascot.png new file mode 100644 index 0000000000000000000000000000000000000000..2eacf088cbfef9e84780e46bb64f07449aea6900 GIT binary patch literal 215436 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 k|m1 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

im zKLE%L7ZF`q(8P+p9gG9rZD8KaB;Du5s*i5ftVUQ)gcDS_npT~g73$`o{eM-`af97} za+U)JnLh*8A&c~4H0b<8U5%B(WZsW?FZep-nWHGDR2j2*2aTeMqs9b&qBuGGhjJIQ z*~ZUfcTQh#z(}R<$Ypy!+a&>bf7@Xmr*RmN<%$=J&0$)V3oBb0=`6RKD_T{N;s8VM zoQpd6-2{Inf7YmSx8lVP5D-V8D79AwG(J0oQ7@c}XAeId=>5cPUBpLo8IPyYLMl!k zXqq#KH@q&b*Ok27ffW6gwtBjfB)BQrRx7|$R^a)13$9?5BjkJ1MQ@GJR?B>8v#wug z0Z(PsoXE-*ej(?r`QFQG>rXk&P(V@(p1fs0C};l5e0!8TAFFG32N?2~dF`1wphfcR z+^AN9laCd!EG-J;z3z6rgRv}JDWtc!@lhc;y9>-f-burJ=lQbS?$D8K_h_>YS^6ZbqN|YeHF)9N{LE#-c^N=c7Z$} zwSS16dQ9FyK2F?s;ck!&WSbk~ob|Md$INCu7#o~0Vw>UdfH`_4{eFYv$g~(r(kpQ} zVywob2tSOLg*Nb!;(sWT-P#9Zq3fqO#>~V(3AQWpJlQyz)L*v5A+L)yJ4P3iKz&Z6 zWLwDdF8gG=Ay$*js7MW#D44+_K2EF76mum>dHc#)b@!}liDO4$G2MSSo}f5$#KpK? zuGXWZWg0JFUa~-$sm)nN-*xPGUbgqQT@rxzx4oR^`J2A)zegY*#4(`R?wegf8yT~1 z3c7cBPF&0bXLytZwkJL9QF)``6!z!2Z&qMjcpwBbx!tRT0Q_*>n=6VKX@OJpJ+#F8 z*wu6Fiij6w5qAYL7raJIPXJaaknvq+_A9WoJAq3pf8qXn9>37)9N=8x=G=Q}buL;e zo)Pk2SHoIy-YxnU>_7_7__gxicUTFlrh#Yl{KcwmZzS5n@y-^uQ0|yhT7sB!(F|re z#?UcRp>NujgQ?~`3f@A^+utDf!2u88PwKI=qFe*L#G%%LErkC1K#1cn=e?e@Z=vmJ zJjDH21z&UUfux5FgXY}knpX)1JIe~EU=E&3`QKF{gCE%4oiOCmesbS9-&JRXN0CB! z9^E9>5CO@_r7$smM?OrW4+RnnBjdO*cBzG&xms#z;10n^3&)l2eg?}y5s{FPB^N}Z zA5r223&%?99o}tBNq#u^*R4lo=-U<*@&2?SkrRd^ZYcuv;{ZZ-4@VNL}l$i9>QApw3| zWX{R3ZbRK`sXc;`jyje0An{0u-3A+FvD42EMq+VH%Uy6gX;JKA#UD+=VWKj2r!KmV zSI}j9PunE{cz@exF-?DbJoWz!R=YXE&MY}wpHg?zjYs_RFu0wccB@Jr5Xjlm2jAao zq~_3W&RW!iQ)AG&G*DQS*D$tYW1kU5p7x+9BH7q&rq~|mxSfl5UKQ~GIvK+WsvD@) z$yzrC^XiiqouH_tN9Y!}KNGk7%uBV)2cMGzBe|ELose&<$Yn4%Ki7dbd!RYjTt*7( zh`$Q(iwjP!=Bxf>&My625f#j7Ce|W-+RwX;Bb=Zowd&7PZ_4@Nc|@>lVO=zlJThQC zo$Xg26M8&&e==7g4#ensO3ixIpg00q-O~Ot7LBRTA4NuM)|nuW+%!s`x&@2inJlh1 zI=1;aN_x)pGzz-73BPXCs7SRAdJ)lpk?ErzP2T zV$6e|*S^l1z>_+T2)F`Uidshx1KUfV=)mV|&}LNc+$TA@T9VC`;Z7#b=oB*HH}=D$ zKqihjU$FSK=fUC~vX<1g9kWEha$h84j!`0$wFT%0R!k+Ts?RriDiy4Z?HQmBj6E)h zCr-YhIxv)cHY;I*p%O3J%l5vuO9JrzwpS7JkNU13XSi$l2Bn3!L4j(`tIF3r6_h=< zwE?Vx%_(ohfzDu9G+@n%n??bJFZ=E&K)$$Y%NiIM>vhDaVgwSj2B+~DbvsAfl(C&> zjsjkcQ2rh1z0OjPww*F#5tzwb=tM@pODsMI=k@%a>x(Hzl?=s^v`k1avh|ovF6 zN42Aw*Vnq8&i(VUT%NwW|CTw{;|C8w^appPRV3 z#H5&pDy6$j6mskUR*Z2H?tCohb?XV}8b=W+gnEuLmU+5I8G4DFPWv;g{5R=C#fsl} zn+$Tqf0$;;iXMRv$I~4YCm6caluR-iwCiM2CuM{r9|pF|%Q?1K2gZ`voBLsk1KSy* zW(vhZ(=WH%JUdA9SZU``Pnnz+8@C9!QCSyF_v@Rs|4%aiTM_vC)s?c8==uD;d1dmuT@>=Ef>V6cG4`O9_KWF}O?g*Ymy9`nW!^rpH0DRO10`Ok9O9Jrz zHb7*)9EMXrP2eG^%*>lk3T(dFmj4J@jRjCX@^Uwu#+-X103f(`e5G^cTG9iYRUB=B zS6b=Zm8_x?tfQ9U(DiXTJw>#G#9gW)uB(|~z~eB-zL?@fa}V;2WM)F)5eEz?2pWwq zp%-)vv>3BOf)S7nV{C?C)SPt>I2Lfg%$-f@m50B}yi*^;+j`YlwKB0;L}|$agbpLa zLQmDArpM|ysG>6Gys9J^W9|MLM;v|)RnGY5XiRIvyccbIR+jz(c0($FWx!iWc!IO` zqx8?+%I0&j%9l$Zf@%h#r3!{Q(88Qd;Gq77y{FSG(ETYAguhhsU&!`1AYp19>zNWK z676)co}BP$b*(XkBKJeZil9eRCue``p1F5`e6^!FOo;w^VHH=Ew_o$rv020*Yy(@}1Qmz}XsDx=*5LVz! z_<1bIJGbJMKtt3>J|Hd5zs-J1U=*r83U&)&1k|e?&x7x^z`{R^lt-oOuORd1+`8u| z%en_lIBNq$&CGg{zi8 z5^0USO_vyul^g--&F3>{4$)8`Mc}jKSToQU6#!b5Rh)VL?!x4Z zU9N`0u;}^d7Mvx8aZCm2IAa#zRiK8r>3{f_G*xwOc&a1}-3A4;JAq2P?`Vz|)TWxib23WP&XRUi@pqAw{*^JzysXLA!(rrsTb| z;XrJi#sjz~sr*TS8&Koa{_imUn?di5=x{$_{@*D{1juk4rg-YqZJGzT{&}nb^DSx- zRPafb4+ky+>@2iH`1-mp>U69eBAObt`54uFq81g%&uZe5}&mUMB_Z;Y?T^fUDADm6Lsv6oLn#f?{m8(0Pl4hXJp?K zX6;@?6SKosGr{vq-&Qvpst9;{;|7G~ZjV+OGI^tIYg3>|!AS)l zU68;uR~W(@z;t|ytG0;k34siYN*T|pDUMUH3sB8{jMW@{bBZpysAgacghfD5m9#C; z&uWu%W=@qsF2m6lwE`z)UXc_GlG7dQsLLiQ1pgABSJg4+naEO3ss#l)LTeSZDq4-A zU!f0z_muoCs*+k&v%TfW^9B&As#y`?GjGZwHW+6(Ys!TX!5@pbH09myw?UHxZ4wqJ zSye4!YVWInc1MKg&&DSUoQ@7k{9bcbIpMJ(k~lohj@1=W5W-Aa`$(BqFhT5ff1IXx z8X{hHV|;O(;;Vj&hy5|CZ;tT~=dBX2UJ_A2g5%vwRO4>V;+){fFj%^yPECC*@O{M9 zYb08j{pN7MY=;C)=FE0Mdh4-EaA9eVkx{Bb>b$Y)XB<~6ouD$S_@%~x43-phHNKL$ z6|-9K-g!RKSHnR01=FsyN^wjTz0l~U;n`&`rJNO@QL(GqWte16U7lO_f`IaksC(~w zhrq@~g<6zRT$3lrF{2aFAi)uTz8@4Q(IM%evw`blE1TluT*N&R?QV+GRK%$-qp#;U z^#v0Ld<{btLnojoUc29&=md!S2O1;IRK#u6@jN1)6%n^(6}$NqyQ+`2JjK|Zi~(?& zK#Ho}L7C9vT;R_*FqrKNZi;)Grb#>=>OcV4h|h}S$J~UuoRGju)KgSQiJlIZJv9t= z&M^?yIj{hDelOd5+b#*fd)&0Z_AcQpa)JPrb8#++Y1K;gkeGo1KnoAmX;sC5QwCl? zf*(5Z4NOo3P7?n)5$i%oE5um zofrxpwUJdY-oKwB+HsDilbhpdU&Q166c4YSqB{1`e$sLQhP>)n4{B307^e2VMOfIu zvDgk3dQ?&)QF~rB9QmO0#E_1}jHq^Zeysh^ZVg)uiDb7JjExW^MkS@cbN9g7{>F?j zO|cdRM;rw7iK2Q2apFBxB_?iw;|D7orp&S4#FSgpGZ(nUg4PFbGM0d(>qj06`Us-< zQTqTR6l>NqSw|H2>_3?UOoEx1sQacM>dpmEHu;3=Mrii&4qskIUFw7&@f+uw*J(fH z&vGp5M7uRuf%a0I)D(i;&A(S}|N05aLF>I(2kFXI#$li{-Kx+9K1 z8d{e&zB9Au?qm z(aHkisdXgQn9fPfqN!v;}aqQFolv@^+f4ofd))o1V7H4>5fRzUj_GCi(+Cc z=yt}zD!^3I&f~O}3EMd#NyK(V0H%R^4C-!~C(?V71ClIk1@V~F(`Vvz4qW6KP;3ZQ z=pYORyd_Q%MHjJs8sp}%kKJL43gZ@<#A%_;&U=m=B=M|ZrG!UfJqUh+Lcl8`;&4#q zhoHkmjC3&1+SygG4gpP?qJTFolJbMY~80$VsKLdh)=P6F4C&n90wBF;Q{Gar8 zNdVsOR&+xb9dD{MTHz4eTzDzY3yfos6&7E#=8Ha>s^txXHX;|DVvMF~xImzQUt*8x zH(XqZ+(!b?MlmA+7*_6ULhw@<1c9s{swlpb;EUE?vNmU|vOzPpOwoxm+ zK%3Hdh62d~=k%6MHX579lOqbWZ7UrU%litz=;u&-#c1#}*@1$hDP4MPk83c3NUZ=; zxeSzY%Q~U)<=me;3EuE};#*6umMvpq=Txa9w4{y9RH4IjmTG1d$SQ1(zQ?r?aXR&J zILvW8%+Vi*7&|QZ6qNJjY#=u#*(yR@!2iz+5^&=*nD|d6;DKNwYLR|#CS6<7GkVFV7 z=~QchbFqae!p;mwPm|0cJ@a6K$Jb8kB9e1sTAXMq@vt4z!ct8)PCY)m9tqlKT8DGW zPB+be&c8Ax-pyPm!p1`Q3uns(yTE95bBIWZ;!Vyg{ zfycN{F#E?juI6bRiqr9k>i^FoV*lP&kD@wj)`jnb;!fzy<37g}9+WKCElRia1^aNjd=E`IQ0L?*dV6X?=<5&cd&Qw7I zKkbf}vvIVEajq3Ygv8b{b(=n+Su}2uI;2|EsP1@0sq*I+%%X}oDH~XrBZ&6{k`cdP zC-}aCy4ed19JYrhz%%J!2!<&@$1&DfIzs0f;yI>q8qJ;*Hwoql=qIj%sb`C{gMovK zNU;*NwLZc5SjrxlK^_SLKcCJ+wgIG-Agn_MEom>P3g&gos-3;O#T^$3kWxX@V~w*( zilAoP>J*^0q5E7EJB(`BEpVceH*|K0lm#ex7$!nDBc^^4fzEysD4+5eIlK3bNJOKG zs)0j*MhXnbq@3!Q2rP@v3+^=mBb8w2^%K|$3<~z9K|{jwlyo>X*Pr7#N>F>el!}(V zSA2H3K2cqSii%?~4EOC~hfiptV`~hrq8ye_oPy#tO6<`Q|hjSa_ z5)&3AIvyh|3WDazlb@~qA+>8%dm2?E7c<-7vifHbRTo3%E~Yq1kwn~cQvZ_gto`TG zj(|qM#W^T)^Km?jovWHs(dIWz6C)1(t!Iz(#jb=q2X0pj>95Bool2BN9WT9Va?H?@ zE#feZalpA^_X8EVF%%0eQ;)~rbq3MyN88>tE@#kMob3&hKE^qde#XbIf}+|49P?Bpuv0-ksd|Pl zcyvN+Kvw@b0JQFaV*FVh>CAXl=**eABNg|34;%!C%A4TIN z{myzJ!ky#@07V7XjBE_3lOXW0L^dR7g}mF>i)oH(?5MaP`zW;vY+9txm?l~|60GKa z>Wfp~y^M&T{YPDKFWdj*c1Zx<@AlO=^e<1R?uM;%Q-%k^5RuV93G>r&JK*5@A;{ zREvoDJVuaCklh=rM+(!p+aS>0g59>@h({`T|I|)*g+l5CQOMT7_sBjq_mih>u(`1d zNsCfYP6JpZ3k--}IN1t!YgP?}1d4g$?24S!v!!!jOI&_lsne%@u6ip5BJww$n=-(i zC4v#Wp<91o52XNnb7ixvmVPSlX_l`2Mb*iUjN8Tdlkgfsqj0W`V2kMtrEt%klcl%r zDvw(8JP3);n9i&MClCofQ~Il<7Uwnvl&G&nS!T=hqEp~*5U)QTU+$UZax)McBfu!^ z&PjIBc_BGLWAdo6mjH*}Cw5d+%d>Ky0X|eh#KeLofDU#EAY=zkY95&kF1Q}k54A5q z$O-tjz&{s$KlVlJ18mAy5()47%t=KOgw(k>(o&N;31N9o!O%z6d(v~I~imQ zv8gd7ugMQaP{!iX!uTWV7}BH$i!*1;0_9;D7}x=jcNcHX(bTRqg#pTVNRG7-&1l79 z1i-40vuCwS*{)l>?uGW{`$71`f6kS8Ap-%4K>nO$GK?LR?8uBv3zu4+TJ1o0 zV{jpW3T+Shrc$URM@dnAiEhBo0-6u=Y~;}R3#@M@L( zQmY}2EATI{INT3)ScI3)L=#;Dj2HAfswyUq!`G||{WY-BBON06&uxEQ=doZd*hyn& zPzfdeMG{AQV0I|n;USptY_^q@;e-Ql!wUM}1F*)9pd``x}Chv_f& z`^W#i7FMJBEzK%$mQmttSGroFhzrDd(7FR>+m#IHeFz|R?J+@`g2-$}OZy-rl#((w zT*yp0)<$kwJijLmq9YZZUN`Q*?Ca4hXe!(5CV&Ed8XT`$Dku`tp$PulbdYt zo4xhU^2w~s?VeW@(J{J-%P%0<8C)e4v=tj|t%{wH*1qhX^(L-`hYBxCj%M7(ZK^pM;35{Im~0byqHJ28Drm7!R{9G0Ph5dVGx~*qfoDa7ENPb;L)(%t zF8!J8&@Xb{+9wBE+*{{xzRd5L$9U9~`uXw$@%SM3fxtT3O=rdL0o7TDYweTa^&|%} zP9y~=O|Ocxlrx7XEGC?=G4WQyNlt~>yG$%8G6Yeu8CnH4$+8@@6fJdUozGrs0@w#* z0V!8;I3DBaaL7Y=+1}H3NdVsO)(=zn<Ce&;JSGF&;qTV5o>UXD#w(Uu1y$AuLTl$do?!tFYYx;5A`Xn|^g|=v)i&qWf__1J zy+W(FQe{O=0!olsx;1s!(KP`J!Aq*Fl_AY5+Mei;+9iA&+Q#xz9eFJV@ml+n?e4w~N> z;wGF0IpUPZ^_-Wpb6q!D>_rDl-zI?o_1>(IS#9fmm+X^?lqyvnHU)a=8La$oG8&uG zCYFFP8V0=5eUrjbMU;a&5ZYnQt@FOqxCWQLIt$cZARW;l*Yzx31A+y}m&t?}5lcSj z>Cl<0OP_{C$?~R(SEd`VUaq^(h8ts>@pR=`q=Kq zsGBMdT@_s~bbbw>97m05IwJ%=+sT1e9Rg<+Q`t%~lxA$v6g|1rA zmop;*mpn=UGMh9**9!zfsp3|3gsKthb1>d<;l|Qc6+8Y$_#bc!3=nuNyl&3ztqH*A z7?j6F7SzS8s5MfdU%i2q44MWaYNPk7853uPHCd_h!+F*ZsvqBi;`vcs_gweuc&9_7lU_e)i`;y^v~*)X*2Ar)7K+C8W+{i z>=>%6IKON4i^|+4TRduJ<}jy1GVP>POi*bJ@c!rPh?PJ!0A^0;Fe&lnv71Yplu@}8 z34q6giBm|qsO+LFlEWU?;Qo8Oe~9A~*?*S~z`OcS#B3s8)b10gAGHNLR!`qmeH)ApULJjGQoj4k96?m zEnh{|svRo&wdU{$)(9P`9gxL4s~oEliiU|}E$?_y?KEOxGR4shTGR^gr0Oj$gIIJs zPNfm?!KEg&py;V0i038GLp*#@Cs~P=RrF;MeKW?XEn~dG0<6ze?&a{vDwKyyhCP|U zoe^NF&Jd`OR3Hfj)v>MH7>6Q$+7I!1C}QKeHa-)u0P=dU8zIhzEv^~X(S2DPKPL2m zxti&Vi>Fh0o&_%!RjL}3?V!$mqA$`ICk-H#@Z!zW^g69{8B|Au1`AyKXN~&0f>g9y z|5Vb%a|a0<@w{puk?hcPiy}E^%j5+=V5dO2bxMPPB0ESpavX(@06T2HcPxi2g-H(G zIkF?Aj`zy461aQfgo=uTO00D7q)U__^Kk3#yGkQRNZTBSIkQI+=50+ku?=S zhORu&MxT&O0MtcofULSp24eh=1wAIl$lar*3 zsF=i%s;NXv9TZgAcq|?#n`atXdE9|QL0%f@4i2;~uF6wvH$`mgIvV(2u<5tVEF=L9 zsc|M%X7pH@P@{z$V`;Pn%I>yN7Yzbpz<)r>yG{z~qRF9ittN=pnlyxxv;{@G=EwV| zI2=zG8Q}N4T@rxzzrF5G-M;Jk7vngR@x+tB;BWdA0e7CSnUCGE#o9;PToKXV_o9A5 z;Hy_H28S^yx()EMLz@{D1~t0{0OP#~t)8NctG0>5ejks=fx&-!{b}^o zP4wt6Y+D9ov>vhS2k3`I8Qs)IKX0*wMNzk`S|JWIvEX-*ZlvZXw>Je}+S5`*sFI

+?GzX!I6wj4x=CCFWzFX= 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Ⓢ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

;Y&0;xzyq=Cmv z1R!;zhm^XfJS@2bs(wqt-%fbPRk1en&Pv)IZI%K^U1rz+*S`!v((E@OA0Y^G zZnJ>SR*5WsrAk-IYmRyZW&&g)K1TYt+k}C}k{f$neV^~ybL?HtLa+Chr`9Vbii~Mc zxDgEb`qmEcLj^i6mu>Jkg*bRdymO}H^YMhZk#f_wZ(}3haU{>VR$A`ks&GBIB?dmw zb7{oV_pbfp9O0443XjL0FWSJ_)?#t|5O?=`oP-j(b!{S5G^nary>kq+j!=+k-$q#1 zp#}OXKv_jtRRLBFQ05~PVIKvn=$37<7*)w@ z)g4vxTh;A3I+Vn&+6-Yd#9%Nou0==X3QIoOF5@K6YTaVCD5dsyxEIOvhbn=yX@!dm zdVKWJ%X#fqh8`$^aJ&phI@c zwMzirUrW3Dj{}c>Vsi6~moHxY_pdIm2mAZuZWsmut8<~(UZlm5ptK=N9gfO#EvC~e zob>i_H0ohCOEFyr80Vds{lj#ImyXA{y4XXp8Y78TNLnHUR9ve>2<+Mz^D4zKyMruz zfsV<6>#s}nMPRu>yLlEP*e9d8#(Yj)W7~wfm>Q*rX!?D0Bh&T|_z_b)CPLj`qJ6wT z&?a&Xq%3+!omkd{)FEgpG|d_flLA7}N(|Nr>QbgKW|%^JmYM|(g4%kaVQn2-lIO@* zkm{hO19*NSZNB6d#BqSk#srisP+Ne8D@<%u-4Z=;=z`e))Cf>(!s=)JKM@30;v^Vy zqmTLL$lvFABDITwy+ct^=*Py$2=z+iy$rCffvO2jDX?J$NG)-tk>^K1=)R}IAwFWGKHFV#2EjFd+c>D_T{MRWj zDmk%)h{>1an;nIaFni<9Wl@Ky7`&T6=bfK7ZHkrCU!XWu-Ng$2to~aDd(LSNa$vBB zfaF$j2c2vq@2`qTS%+80AHtvcfm3|=l@-#gFk+ytg`s0=B`NRm)I26~397n>Ycz4<19uWo)}mjJw{*De8ge=Tj{KcQ`>{*~$U`hR(TarPs3 zPLI&*?0_M0!$Ef72>Y2;EVu88Do_kV;G$vu4m!`DDlwjJS%Lg(z=QpRSOIgZG!V^jUc>2 zUCmL~$EYcx$}(A6u7=xEayK01==v4fn-EP!QqM>Z#y z+L2`FS_;mlRb(@jg{-Dq1nk)oUROiigy|fQ(@wZ$9!VWaPln zPY0Dtv$z9g8H1<>4*TeO)TeN|7AALTN`_&Fqdnk{jrZ~DOVr<|ah9PR@_BH!*`ioF z0%#Y|C6mWNm&_h|qY)w|mL&hl276zZySTwIts(CYO3HXU;Rq?_{r0c19na-QIOsa0 zqMIxE82q_$vy6A%0O~@-eFRJpNC=c5JrM>Y2(n@~ZFW0ijhs2n0&~$bMmZ~TOD1ZO z@3=_BGP4(_pUwbca(*TPPn8xcMHP6-*f+5pyE2kTr~|p%vAi_-S&siPIWd7{PD)Ua zMdyN32P|dPT8Lb*Do_^ZD8ow=M{>??X6#~uKMFX4l8w(`Z3SjaR8XXfA^X`0zOqd4 zxX6*Do-}YE<0jr>F_$ZdyK~#F}NEcQ(Om*U%DB1G3q%ssd3E^VG?cT z>BXhswQ@put+eqssf<U1+~L(DAdQ#0 z7bqYlg+DiLXIceL$HI{c5o9Ra3`uWKBw79)i2&%*8>$DEWsAj{_e723gB%Cr0C`5Q zj~LG`)|f3Q29zMp$Qz(Ohqa4Dl+@S-r%qh^!P{B8`G0zM^m@Ja?8S@djjw<6+ihL{ z3TuShy=J%G%WIbay#JO_y00*;QT+VX&DH

iY8J`1mlOgC4!djo0S#d`CvRb#bxE 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 literal 0 HcmV?d00001